2

我正在开发一个能够玩各种视频游戏机(真实硬件,不是模拟的)的街机柜。里面会有一台 PC 来运行选择菜单。我得自己写。我还需要编写一个 PLC 程序,它可以执行各种操作,例如控制在 PC 和各种控制台之间切换音频/视频/控制的继电器等。我需要及时帮助完成这两项任务,但他们不是我现在正在做什么。

我作为起点所做的工作与控制器编码有关。基本上,每个玩家的控件由几个按钮和一个操纵杆组成。它们使用瞬时常开触点开关,每个按钮一个,操纵杆上的每个基本方向一个。按下按钮或操纵杆方向,关闭开关。然后通过编码器将按钮的状态传送到控制台。

编码器的每个按钮和操纵杆方向都有一个连接,通过一个上拉电阻连接到 5 伏(“高”)。当按下按钮或方向时,通过瞬时开关进行接地连接。当编码器在按钮连接上读取接地(“低”)时,它知道按钮已被按下,并将其传达给控制台。

我已经在各种控制台上完成了所有这些工作,但我想到了一些可以很好添加的功能。这就是我当前的任务所在。

第一个功能是按钮重新映射。其中一些游戏在设计时考虑了控制器,因此当您将它们与街机控制面板一起使用时,某些按钮可能不在您想要的位置。有些游戏允许通过软件重新映射按钮,但有些则不允许。我的想法是在操纵杆和按钮与编码器之间添加一个 PLC。我将此 PLC 称为“预编码器”。

预编码器会读取一些输入引脚上的按钮状态,然后将这些状态写回一些输出引脚,将它们中继到编码器。优点是它的编程可以将任何输入引脚与任何输出引脚相关联,从而有效地重新映射按钮。每当通过计算机的菜单选择控制台时,也可以选择与特定游戏相关的按钮映射配置文件,并将其转发到预编码器。

当然,读取按钮并将它们的状态传递给编码器的预编码器例程必须非常快速地重复以实现平滑控制。这些游戏将以大约 50 到 60Hz 的频率运行,这意味着每 16.67 毫秒或更短的时间会有一个新的视频帧。理想情况下,预编码器将能够每帧多次重复此例程,以确保绝对最小输入延迟。我想确保优化代码和硬件选择以尽可能快地运行。

第二个功能是涡轮按钮。有些游戏,尤其是街机游戏,即使你有无限的弹药,每次你想开火,或者你的船的大炮等时,都需要反复按下开火按钮。这似乎没有必要,它会让你的手指很快筋疲力尽。涡轮按钮是可以连续按住的按钮,但游戏会被告知您正在快速按下和释放它。这可以在 PC 上运行的任何东西的软件中完成,或者使用 555 计时器等模拟解决方案来完成,但最好的方法是将涡轮按钮计时与视频刷新率同步。通过将来自 PC 或视频游戏控制台的视频输出的垂直同步脉冲馈送到 PLC,它将准确地知道一帧视频的渲染频率。然后可以通过定义来控制 Turbo 按钮时间,在帧数中,应按下和释放按钮的时间段。计时信息也可以包含在游戏特定的按钮配置文件中。

第三个特点是慢速按钮。实际上,这可能仅适用于操纵杆,但我将其主要方向的开关称为按钮。在某些游戏中(它可能只用于 shmups),有时需要将您的角色(船/飞机)移动通过非常狭窄的空间。如果响应即使是最小的操纵杆输入,移动也太快,您可能会走得太远而崩溃。这个想法是,当按住一个慢速激活按钮时,操纵杆将通过以与涡轮按钮相同的方式快速激活和停用它而降低响应。

我不确定我是否希望预编码器本身观察垂直同步脉冲,或者它是否会减慢它的速度。我目前的想法是单独的 PLC 将负责驾驶室本身的一般管理;观察“on”按钮、切换继电器、直接与 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

如果您已阅读所有这些内容,感谢您抽出宝贵时间。所以(最后),这是我的问题:

  1. 你的总体想法是什么?关于我的总体想法,可行性等?

  2. 我应该为预编码器使用哪种 PLC?我最初想尝试一个 Arduino,但我的阅读表明它太慢了,因为它使用了高级编程库。我在另一个 PLC 周围构建自己的电路板没有问题。

  3. 我应该使用什么语言对 PLC 进行编程?我不介意学习一门新语言。这个项目没有时间限制,我会尽一切努力让预编码器尽可能快地运行。

  4. 将我的程序闪存到 PLC 上需要什么?

  5. 在运行时,这些 PLC 应该如何相互通信,以及如何与 PC 通信?

  6. 我在正确的地方问吗?正确的论坛,正确的部分等?还有什么地方我应该问?

热切期待您的回复,

-抢

4

1 回答 1

1

我有一些想法可能对你有用:

你的总体想法是什么?关于我的总体想法,可行性等?

  • 这个项目听起来像是你想在 Defender 作弊,就像我小时候在 Atari 操纵杆中使用 555 计时器芯片一样。
  • 该项目是可行的,但您将需要一个非常快的 PLC。
  • 您可能会花费大量时间来完成这项工作,例如任务。

我应该为预编码器使用哪种 PLC?我最初想尝试一个 Arduino,但我的阅读表明它太慢了,因为它使用了高级编程库。我在另一个 PLC 周围构建自己的电路板没有问题。

当我想到什么 PLC 可能足够快时,我想到了一些事情。

  • 如果您使用具有任务架构的 PLC,您可以使用事件触发垂直同步脉冲上的任务,并使用另一个事件触发控制台活动。如果您使用没有任务架构的 PLC,用户可能会认识到程序扫描与垂直同步和游戏中的活动同相和异相时将发生的可变延迟。如果 PLC 足够快,例如 1ms 扫描时间,这可能不是真的。

  • 大多数便宜的 PLC 永远不会成功。开销和性能将使大多数 PLC 每次扫描保持在 5-10 毫秒左右。但是,基于 PC 的 PLC 可能运行良好。所以也许 Beckhoff 控制器会很好地工作。如果您使用 CX2000 之类的设备,它具有 Windows 7、USB、DVI 用于用户界面,以及侧面的 Ethercat 总线,用于连接控制器和控制台连接的物理 I/O 卡。请参阅下面的软件。有许多非基于 PC 的 PLC 可以正常工作,但这些可能会很昂贵且更难集成。

  • 如果您使用足够快的模型,Arduino 解决方案应该可以工作。但是您的开发时间会更长,因为它除了空白屏幕和一堆库之外什么都没有。与真正发光的 PLC 相比,故障排除更让人头疼。您需要仔细计划以使 Arduino 正常工作。此外,与微控制器的硬件接口更难,您必须管理代码中的开关去抖动。每个 PLC 在其输入中都有过滤,并且 I/O 的多样性使设计变得容易。但是,如果钱是一个问题,那么 Arduino 或其他微控制器确实是一个选择。快速 PLC 可能非常昂贵(800 到 2 万美元,想想大约 1500 美元)。如果您要构建多个系统,Arduino 可能会更好。

我应该使用什么语言对 PLC 进行编程?我不介意学习一门新语言。这个项目没有时间限制,我会尽一切努力让预编码器尽可能快地运行。

  • IEC61131 是 PLC 编程语言的标准。在美国,大多数 PLC 都是用梯形逻辑编程的,因为它非常容易学习,并且可以更快地在机器中进行故障排除和维护。结构化文本也有其优势,尤其是在性能方面。它看起来像是基本/C/Java 的某种融合,易于学习并且看起来几乎就像您的伪代码示例。至于你的项目,我认为它可以用任何一种语言编程。我永远不会使用其他 IEC61131 语言来完成这项任务。

  • Beckhoff TwinCAT3 使用 MS Visual Studio 作为 IDE,您可以在同一个项目中编写选择菜单(VB/C++/C#)和 PLC 代码(IEC61131)。TwinCAT 的运行时许可证(在 CX2000 单元上)在内核模式下运行,在 Windows 7 不做其他更重要的事情时为它提供处理性能。我用过一些 CX1020 型号,它们的表现都很棒。扫描时间约为 5 毫秒,代码量很大。更快的单位将扫描 <1ms。

将我的程序闪存到 PLC 上需要什么?

PLC 不像微控制器那样“闪烁”。无论您使用什么软件来编写软件,都可以连接到控制器。术语“上网”建立了联系。术语“下载”和“上传”是指在开发计算机和 PLC 之间传输程序。术语“在线编辑”是指在 PLC 执行代码时进行代码更改。当现代 PLC 断电时,它们使用电池复制程序并将用户 RAM 复制到闪存。当他们通电时,他们将闪存复制回 RAM。要连接到任何现代 PLC,您将使用 USB 或以太网电缆。

在运行时,这些 PLC 应该如何相互通信,以及如何与 PC 通信?

您计划不止一台 PLC?PLC 与 PC 的连接是一个复杂的主题。术语“OPC 服务器”是指一些 [昂贵的] 软件,它可以让您的自定义 Windows PC 应用程序访问 PLC 中的内存。Beckhoff 解决方案将所有这些都很好地粘合在一起,而无需购买更多东西。PLC 到 PLC 的通讯更容易。该方法通常是通过以太网进行的,并且细节差异很大。

我在正确的地方问吗?正确的论坛,正确的部分等?还有什么地方我应该问?

  • 当然,这个论坛上有一些 PLC 活动,似乎倾向于核心 PC/Web/Mobile 开发。我来这里是为了为我更深层次的软件问题提供非常聪明的答案。

  • 您可以尝试 plctalk.net,这是一个更面向具体工程师和服务技术人员的论坛,具有与机械和自动化相关的广泛连接性和兼容性问题。你可能会对垂直同步脉冲有些茫然。他们的技能围绕着一种工业范式展开,在这种范式中,可靠性可能是他们的最高要求。

  • 您还可以在 Arduino 或 Microchip/Atmel/ARM 论坛上询问有关性能的问题。如果你告诉他们 PLC 比他们的硬件快,那会激怒他们!他们可能会告诉您,您可以获得微秒级的性能数据,如果您使用硬件中断和大量物理电路来实现这一点,您就可以获得,并且您能够应对故障排除的不眠之夜。

-丹尼斯

于 2016-02-27T03:02:28.337 回答