切换语言: Deutsch English Русский

教程:运算器教程

From Official Factorio Wiki
Revision as of 14:40, 8 October 2021 by Bilka (talk | contribs) (fixed links)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

这是一篇 进阶 教程。 新手应该参考 信号网络示例大全 中的例子,及 信号网络 页面来建立对信号网络的初步认知。 这篇教程默认您对于电路及更进阶的SR锁存器,储存单元,和时钟信号有基本的了解。

简介

组合逻辑通过以某种方式连接各项输出端至输入端来实现想要实现的逻辑功能。更加进阶的逻辑功能需要众多的运算器实现,而一些实用的基本逻辑功能可以由少数几个运算器实现。组合逻辑得以运行是基于游戏60次每秒的数据更新,运算器对每一次更新进行运算,然后加总及(或)选择结果值在下一次更新输出。

当某个逻辑值被运算器运算,运算器的输出不会被信号网络识别直到下一次数据更新。所以当一个判断运算器被用于判断某个输入,它的输出值并不会立即生效,而是需要等到下一次更新。这个特性非常重要并且在多个运算器串联时可能导致时序错误和显著的延迟。

游戏中的数据线缆红线缆绿线缆类似于计算机中的总线;它承载了相连线缆中的各种信号,意味着如果线缆中有相同的信号,线缆将自动将他们相加。如果信号不同,信号仍会被承载只是信号种类不同。

在交叉连接运算器时,最好使用未被使用颜色的线缆来交叉连接,这将隔离输入及输出的信号网络,并可防止意外连接的其他信号网络的输入。运算器在运算前将加总红绿线缆输入的信号,所以两种线缆都可用于将输出端连接回输入端。但在大多数情况下,用相反的颜色可能更实用,这样就不会干扰结果输入及输出。

虚拟信号

可以在信号网络中使用的虚拟信号

除了基本的物品信号,异星工厂的信号网络也包含了一些不代表任何游戏物品的信号。这些虚拟信号充当着玩家自定义的用于信号网络的频道;可以代表任何玩家希望的意义。目前共有48个虚拟信号可以在信号网络上使用。

  • 36个字母及数字
  • 九种颜色:红,绿,蓝,黄,品红,青,白,灰和黑
  • 三种图标:确认标志,提醒标志,和一个白色的点标志

逻辑信号

此外还有三种被称为“逻辑信号”的虚拟信号。与其他的不同,这三种信号不能在信号网络上传输,而是作为控制运算器行为的逻辑功能。具体来说,这些逻辑符号充当着通配符的作用,它们表示零个或多个任意信号而不是表示单个离散信号的特殊信号。异星工厂的信号网络实现了三种类型的通配符。

所有信号
Signal everything.png

“所有信号”通配符用于判断运算器。它的具体行为取决于它被用于判断参数还是输出:

  • 输入:如果所有输入信号都符合判断条件,返回真,有任何不符合条件的输入信号,则返回假。
  • 输出:输出所有非零输入信号。

用于判断参数时,所有通配符可以当作逻辑与,或者全称量化。用于输出时,可以被当作输入信号的echo或转存。

备注:只有在输入不是每个通配符时才可用于输出。

任一信号
Signal anything.png

任一信号通配符也是用于判断运算器,但只能作为判断参数。 输入至少一个输入信号,如果任一信号通过判断条件,将返回真。如果没有信号通过判断条件,或者没有输入信号,将返回假。由这个行为可得,任一信号通配符可以被当成逻辑或,或者存在量化

每个信号
Signal each.png

每个信号通配符可以用于判断运算器算术运算器,且行为相对上文两种通配符较为特殊。总的来说,它分别地对每个信号进行运算处理,具体地行为取决于用法和用于哪种运算器。每个信号通配符可以用于输入,也可以用于输出,但只有当同样用于输入时才可用于输出。

判断运算器中,用于输入时,每个信号通配符分别将每个信号与判断运算器条件比较,返回每个通过条件的信号。这种是否返回每个通过条件的信号的方式取决于它是否也用于输出:

  • 只用于输入:将每个通过判断条件的信号加总,并针对输出设置,返回通过条件的信号的总数或值的总和于设置的输出信号上。
  • 输入及输出:返回每个通过判断条件的输入信号,输出值取决于输出设置。

算数运算器中,每个输入信号将分别由配置好的算数运算处理,和判断运算器一样,输出信号取决于每个信号 通配符是否用于输出:

  • 只用于输入:每个运算的结果将加总并返回值到设置的输出信号上。
  • 输入及输出:将输出每个输入信号运算的结果。

每个通配符使用上比之前两种通配符来得复杂,但也提供更加强大的功能。

隔离器 & 门控

算数运算器设置为(输入:每个信号+0,输出:每个)可以用于交换不同颜色线缆上的信号,并作为隔离器来防止下游逻辑回授影响信号网络的输入。

判断运算器设置为(输出:所有信号,输入->输出)当逻辑条件为真时即可以充作隔离器。这可以选择性通过或仅当需要时'筛选'输入信号。这可以针对特定火车站轮询远程火车站的箱子内容。

SR锁存器开关

如果你需要对某种东西设置一个触发器,但保持开启状态直到达到某阈值,重置值。你将需要一个判断运算器及一个算数运算器。(两个判断运算器和一个常量运算器也可以用于更复杂的多信号判断。)

设置第一个判断运算器为需要的条件并输出常量1.然后连接输出端至算术运算器的输入端,并将输入信号乘上偏差值:触发值和重置值的差,并连接算数运算器的输出至判断运算器的输入端。算数运算器的输出信号必须与判断运算器的输入信号一致。 当达到触发条件时,判断运算器将输出常量'1',并在算数运算器中乘上偏差值。这将'保持'输出为真直到达到重置值。

在这个例子中,管道泵只有在轻油达到20000时才会工作,并在轻油达到5000时停止工作:

SR latch.png

类似的有更加详细设定的备用蒸汽能源的范例:SR锁存器 – 单判断运算器

数值储存

如何储存一个恒定值以供将来取用,无论对于基本的计数器或者更加进阶的逻辑功能。一个判断运算器的输出端连接回输入端并设置为大于零(对于正值),输入 -> 输出 将'保持'一个值,只要信号网络上的其他输入都是零。 任何持续的非零的输入将创建一个基本的时钟;储存值将与输入值相加后每个循环递增。一个脉冲信号将导致储存的数值增加一个脉冲信号的值。不符合判断条件时或负的脉冲信号的值等于储存值时将导致储存值重置为零。

基本时钟

一个基本的时钟。持续递增的信号1的上限为30个tick。

时钟由输出端连接回自身输入端的运算器组成,这样一来每个循环都会增加自己的计数。不管是算数运算器或判断运算器都能用于组成时钟。

算数运算器回授将导致数值无限制的增加,所以需要一些额外的控制逻辑来重置。

自动重置的时钟需要一个判断运算器,将输出连接至输入并设置为小于(<)且 输入 ->输出。当一个常量运算器连接至输入,每个周期都将上数常量运算器输出的值直到达到判断运算器设置的值,然后输出的0与常量运算器相加,重新开始下一个周期。

时钟的周期不包含0在内,将从常量运算器输出的值开始,且会包含导致判断条件为假的值。算数运算器可以修改时钟序列,但需注意其输出比时钟周期晚一个周期。

一个仅计数一次的时钟可由下图创建:

单次时钟。 运行直到 T=Z+1. 重置当 R>0.

脉冲产生器

连接一个额外的(=)判断运算器与基本时钟输出将创建一个脉冲产生器,每当基本时钟运行至指定条件时将产生单个输出。可以使用任何输出值,不论时直接来自时钟序列(输入 -> 输出),或常量1,或某个分离信号网络上的逻辑信号,如来自一个常量运算器或是其他信号网络。 PulseGen.png

  • 判断用的常量1可以为任何正整数,只要它在你的时钟的上限内。
  • 如果以上述计时器为例,脉冲发生器将以 30 个tick或每秒 2 次生成 1 次脉冲,因为异星工厂以每秒 60 个tick的频率进行更新。

计数器

计数器用于对输入事件计数,并输出其总和。任何脉冲信号输入进一个配置为输入 -> 输出的判断运算器将构成一个计数器,但输入端在其他时刻必须为0否则计数器就成了一个时钟。一般用脉冲产生器来做到这一点。 如果将几个具有时序性条件的判断运算器(用作隔离器)与时钟及脉冲脉冲产生器组合,连接至计数器的输入,可以实现远程轮询及计数隔离器的内容。

逻辑闸

某些逻辑闸仅对布尔值起作用,如0或1。其他逻辑闸也能用于其他值。例如第2个

内建

算术运算器内建有或,异或,和与运算。 这些运算为位级运算,即以二进制形式对数字的每个bit进行运算并返回结果。

位级 与 运算的例子:

输入 1 输入 2 输出
0 1 0
1 1 1
1 4 0
1 3 1
10 30 10
10 40 8

如果你的输入值仅为布尔值(1或0),算术运算器的逻辑运算就可以被当作逻辑闸使用。

一元非门


NOT.png

真值表:

输入 输出
0 1
1 0

二元或门


OR.png

真值表:

输入 1 输入 2 输出
0 0 0
0 1 1
1 0 1
1 1 1

*备注:可以用于任意数字输入,输出为信号"A"。同样有效于布尔值输入。

二元或非门


NOR.png

真值表:

输入 1 输入 2 输出
0 0 1
0 1 0
1 0 0
1 1 0


*备注:可以用于任意数字输入,输出为信号"A"。同样有效于布尔值输入。


二元异或门


XOR.png

真值表:

输入 1 输入 2 输出
0 0 0
0 1 1
1 0 1
1 1 0

*备注:仅可用于布尔值输入。

二元与门


AND.png

真值表:

输入 1 输入 2 输出
0 0 0
0 1 0
1 0 0
1 1 1

*备注:算数运算器的示例仅适用于非布尔值,并在它们作为输入时返回非布尔值,但仅限两个值都不为0时。

*备注:判断运算器的示例仅适用于布尔值。可以通过将"1"修改为输入数量-1,或将"2"修改为输入数量,配置为有任意数量输入,如下所示的三元与门。

三元与门


TrinaryAND.png

真值表:

输入 1 输入 2 输入 3 输出
0 0 0 0
0 1 0 0
0 0 1 0
0 1 1 0
1 0 0 0
1 1 0 0
1 0 1 0
1 1 1 1

二元与非门


NAND.png

真值表:

输入 1 输入 2 输出
0 0 1
0 1 1
1 0 1
1 1 0

'*备注:仅适用于布尔值输入。可通过将"2"修改为输入数量,配置为有任意数量输入。

二元同或门


XAND.png

真值表:

输入 1 输入 2 输出
0 0 1
0 1 0
1 0 0
1 1 1

*备注:仅适用于布尔值输入。

存储单元

简易锁存器

运算器回授自身时,建议使用与主要输入输出不同颜色的线缆。

SimpleLatchv2.png

真值表:

输出 1 输入 1 输入 2 输出 1 (t+1)
0 0 0 0
0 1 0 1
0 0 1 0
0 1 1 0
1 0 0 1
1 1 0 1 (2)
1 0 1 0
1 1 1 1 (2)

输出1为图中回授绿线缆,承载锁存值 输入1是设置信号,输入2是重置信号

正值储存

用于储存正值的储存单元,支持重置:

AdvancedMemoryCell.png

连接需要储存的值作为信号 I于右侧来设置储存单元,连接负值信号 I于左侧来重置。

  • 储存单元的输出为两个互斥的信号。
    • 当输入信号 I>0时,信号 I被传递到另一侧输出。
    • 当输入信号 I中断时,则输出将接收具有上一个信号 I值的M信号。
  • 当输入信号 I中断时,需要两个tick才能切换到储存的信号M。
  • 当输入信号 I仅存在1个tick时,储存单元将在最后两个值之间无限循环,每tick切换一次。
  • 信号切换是无缝的,即没有信号的间隙。

正值及负值储存

这个储存单元可以储存正值或负值。重置功能由一条专用输入实现。此外也能储存仅1tick的脉冲。论坛帖子.

  • 输出 M(memory)是上一个非零的输入 I(Input)。
  • 非零的信号 R(reset)信号将重置电路。
  • 1tick的脉冲 R或 I能被储存。
  • 负值也能储存。

Memory cell with negatives.png

乘法器和字典/数组

CombinatorMultiplierDetailed.png
  • 将两个信号相乘非常简单且仅需要一个运算器,但将多个信号相乘就复杂的多了。
  • 下面展示的证明解释了算式及工作原理。
  • A字典是一个允许特定信号的值通过的系统。比如,A可以包含许多信号(可以是来自常量运算器也可以是一个储存单元)且B可以包含一个特别的信号(如蓝色信号)。最终剩下的是蓝色信号的值。这是因为其他的信号都乘上了0。
  • 数组和字典类似,但不同于使用一个信号当作键值,数组使用数字。常量运算器配置为每个信号映射为唯一编号(如1 黄色传送带,2 红色传送带,3 蓝色传送带,4热能机械臂,等等)。然后,用一个配置为"输入:每个信号 = 所需信号的索引,输出:每个信号"的运算器,其输出连接为字典的输入。
CombinatorMultiplierMath.png
   ((A+B)^2 - (A-B)^2)/4 = AB
   (A+B)^2 - (A-B)^2 = 4AB
   (A^2 + 2AB + B^2) - (A^2 - 2AB + B^2) = 4AB
   4AB = 4AB

请参考