勇哥注:
这节讨论一下运动相关的组件。Drive组件的应用,它用来定义轴;Drive Behavior组件更像是运动方式(算法);
Logic Steps逻辑步骤的功能可用于内测,即是不用plc,自己写逻辑测试动作。
(一)Drive组件
把游戏对象添加Driver组件后,就构建了运动轴。
Drive将沿定义的旋转轴或者线性轴移动游戏对象。
由于Driver不会向plc公开Signal接口,为此,除了游戏对象的Driver脚本之外,
还要添加Drive Behavior脚本,这个脚本包括特殊行为(如气缸或者位置控制驱动器),以及支持各种信号。
线性轴的运动方向始终根据驱动所连接的局部坐标系定义。
在旋转轴上,轴的旋转点是局部坐标系的中心点,围绕定义的轴旋转。
驱动器也可以连接到传输表面,这种情况下,驱动器仅移动传输表面上的MU。
对于线性驱动器,标准单位是毫米,而旋转驱动器则是度数。
速度的标准单位是毫米/秒,度/秒。
注意unity中的Transform中的则是米为单位。
Drive组件、Drive Behavior、PLC之间关系和信号传递。
如下图的描述。
Driver的属性面板
下面定义了两个Drive,GantryY移动时会带动GantryZ一起动,
而GantryZ仅使用局部坐标系,它根据GantryY的位置移动。
Drive的图标是个齿轮。
下面是Drive的属性面板。
Use Acceleration 加减速这个是个开关,会对Drive Behavior组件的某些类型发挥作用。
Move This Rigid Body on the Drive:
通常,线性或旋转驱动器在不使用 Unity PhysX 刚体的情况下移动,因为这样更稳定。
在某些情况下,可能需要移动 Physics Rigid-Body。
例如,如果带有零件的平台应该旋转,就会出现这种情况。要启用此功能,您必须启用此选项。
轴的方向的指定
当你选择GantryY的时候,会出现特殊的方向手柄。
勇哥标记了红色箭头所指的就是方向手柄,你可以点击灰色的方向,以切换轴运动的方向。
粉红色箭头表示正方向。对于旋转轴,您也可以通过单击粉红色箭头来更改方向。
或者,您可以使用热键更改行驶方向。通过按 SPACE,您可以反转当前所选 Drive 的方向。
通过按 TAB 键,您可以遍历所有 6 个可能的方向(3 个线性方向和 3 个旋转方向)。
这个运动方向的图标,受下面开关控制:
驱动器限制
可以定义驱动器的上限和下限。这些限制仅在有 JogForward 和 JogBackward 功能的驱动器上使用。
限制显示如下:
你得勾选use Limits。
这里勇哥故意把Upper Limit设置较大的值,你可以注意到正方向粉色箭头的长度就是这个2000。
限制这个东西就类似于运控卡中定义的软限位功能。
你可能想知道播放的的时候,位置如果超出了这个限位,是返回报错信息?还是到最大位置就不动了?
在模拟模式下,使用手柄,您可以在每个方向上以点动模式启动驱动器。
如果定义了驱动器限制,则驱动器将在其限制处停止。
此外,驱动器的当前位置会动态的以 mm 为单位显示。对于旋转轴,它以度为单位显示。
这里也可以用快捷键,按键1是往负方向,按键2是往正方向。
(二)Drive Behavior组件
Drive Behavior定义了Drive的详细的行为。
game4automation预定义了一些标准的驱动器行为。
所有的行为都是Driver_开头。
这个系列的组件如下图所示:
(1)Drive_Cylinder
圆柱运动的模型,我们通常可以使用它来模拟气缸。
它有一个最大和最小位置。移入与移出的速度以秒为单位,以TimeOut和TimeIn参数来定义。
还可以定义两个传感器,将气缸停在Max或者Min位置。
可以通过Behavior Signals下设置布尔值来手动控制。
可以PLC IO控制这个气缸。
(2)Drive_Simple
Simple Drive 仅由布尔值控制。可以控制它向前和向后行驶。
我们可以用它来模拟IO控制的电机。
下面是simple 驱动器的属性窗口:
(3)Drive_DestinationMotor
目标电机类型,由目标位置和目标速度控制。
这一种类型比较类似于电缸,但却不是脉冲型驱动器。
设置目标速度和目标位置后,可以通过布尔值 Signal StartDrive 开始移动。
驱动器到达其目标位置后,Is At Destination 将设置为高电平。
(4)Drive_FollowPosition
这是跟随位置类型,其中驱动器完全遵循 PLC 的当前提供位置。
这一种就是我们熟悉的脉冲型驱动器了。但是驱动器的速度由发送位置的频率来决定。
(5)Drive_Gear
此行为模型可用于将两个驱动器连接在一起。
主驱动器将控制齿轮所连接的驱动器的位置。
这对于两个夹持手指非常有用,其中只有一个由气动模型控制,第二个则相应地跟随。
齿轮控制驱动器的位置公式为:
CurrentPosition = MasterDrive.CurrentPosition x GearFactor + Offset。
(5)Drive_ContinousDestination
该驱动器不断尝试以给定的速度运动到目的地。
与 Drive_FollowPosition 不同,它可能需要一些时间才能到达目的地。一旦 SignalDestination 发生更改,
此驱动器始终开始驶向不同的目的地。
请注意,您需要在连接的驱动器中打开 UseAccelearation 才能使用加速度值。
这种类型的驱动器就PositionControl(位置控制)
实际上,这种类型就类似于运动控制卡的ptp运动的api发送脉冲的效果。
(5)Drive_Speed
Drive_Speed 是通过速度控制驱动器。你不能直接控制位置。驱动器始终以给定的速度行驶。
正速度值表示前进方向。负速度值表示向后移动。
请注意,平滑加速不适用于此驱动器。如果要停止驱动器,则需要将速度设置为零。
这种类型的驱动器称为 SpeedControl。
此类型在运动控制卡里,也就是jog运动了。
(6)Drive_ErraticPosition
此驱动器仅用于测试目的。它不断移动到 MinPos 和 MaxPos 之间的随机位置。
(7)Drive_Sequence
这是一个动作序列。
这个是不建议再使用功能,而是使用新的 LogicStep 可视化编程,它更简单,为您提供更大的灵活性。
启动序列步骤
Drive_Sequence 行为允许定义简单的运动序列。
序列中的每个步骤都可以设置 Drive speed 和 Drive Destination。
该步骤在前一个步骤之后自动启动。如果在 Wait For Signal 中定义了 PLCSignal,
则在将 Signal 设置为 true 之前,Step 不会启动。
结束序列步骤
在 Wait After Step 中,可以定义一个时间(以秒为单位),该时间应在驱动器到达目的地后和开始下一步之前等待。
Finished 信号是可选的,可用于启动外部进程或 Drive_Sequences。步骤完成后,此信号将立即设置为 true
从它的属性面板可以看出,这一种就是运控卡的类似于连续插补、缓存区动作、前瞻等类似的功能。
(三)Logicsteps 逻辑步骤
使用 Logicsteps,您可以轻松创建一系列生产步骤,而无需连接 PLC,或者只是为了模拟您的过程。
包括驱动器、传感器和布尔信号的控制。可以使用多个预定义逻辑。
也可以定义用户定义的逻辑 以下章节介绍了可用的逻辑以及定义您自己的逻辑的方法。
Logicsteps 的主要优点是,无需编程或任何其他安装,即可非常容易定义一系列操作和条件。
要使用 logic steps,请添加一个空对象。然后,这些步骤将作为组件附加到此对象。
附加组件的顺序决定了步骤的使用顺序。您可以使用拖放来更改顺序。
如果您有多个进程,请为每个进程使用单独的空对象来定义顺序。这有助于您保持概览。
必须定义每个步骤,例如,开始驱动,等待物体到达传感器,停止驱动。
对于每个步骤,您可以定义一个唯一的名称。这有助于在序列中进行定向。
对于像 goto 和 jump 这样的 logic 步骤,必须有这些名称。
步骤中的另一个基本属性是 blocking 属性。如果 logic 具有此属性,则该 logic 是唯一正在运行的 logic 。
例如,“WaitforSensor”步骤会阻止所有其他步骤,直到传感器具有所需的值。
每个预定义的阻塞逻辑都包含一个进度条。
这样你就可以一眼看到它。非阻塞逻辑的执行时间为 0 时间。
当一个 logic step 附加到 game 对象时,scene menue 提供对所有 logic steps 的快速访问。
在菜单项 game4automation/AddComponent/Logicstep 下提供了另一种选择逻辑步骤的可能性。
Logic step Delay (逻辑阶跃延迟)在这里,您可以在运行时设置特定的延迟(以秒为单位)。该步骤还提供了一个进度条,该进度条由 Unity Fixed Update 更新。
逻辑步长 Drive to在此步骤中,您让驱动器移动到某个位置。该值以 mm 为单位指定。如果选择 relative,则定义的移动将添加到驱动器的当前位置。进度在元素中可视化。
Logic step 设置信号 bool特定的 bool 信号设置为 true 或 false。
逻辑步骤 Start drive speed在此步骤中,将设置驱动器的速度。这允许您启动驱动器。如果速度设置为 0,则驱动器停止。如果为正值,则驱动器向前移动。负速度会导致向后移动。
逻辑步骤 Start drive to在此步骤中,您让驱动器移动到某个位置。该值以 mm 为单位指定。如果选择 relative,则定义的移动将添加到驱动器的当前位置。
逻辑步骤:等待目标上的驱动器停止每个操作,直到指定的驱动器到达其目标。
逻辑步长 Wait for sensor此步骤用于等待特定传感器。使用 “Wait for occupied” 复选框确定哪个传感器状态会触发该步骤。
逻辑步骤 跳转到信号根据定义的信号,您可以跳转到选定的 logic step。
如果当前可用的 logic steps 没有提供您需要的功能,您可以实现自己的 logic step。
为此,请在 logicsteps 文件夹中创建一个新的脚本文件。您的 user 类必须是 LogicStep 类型。下图显示了当前脚本的示例。
public class LogicStep_StartDriveSpeed : LogicStep { public Drive drive; public float Speed; protected new bool NonBlocking() { return true; } protected override void OnStarted() { if (drive != null) { drive.TargetSpeed = Mathf.Abs(Speed); if (Speed > 0) { drive.JogForward = true; drive.JogBackward = false; } if (Speed == 0) { drive.JogForward = false; drive.JogBackward = false; } if (Speed < 0) { drive.JogForward = false; drive.JogBackward = true; } } NextStep(); }
主类 logicstep.cs 包含按定义序列处理多个步骤所需的基本函数。当到达最后一步时,序列将从第一步重新开始。
该类包含以下方法:
protected void NextStep() - 调用序列的下一步
public void StartStep() — 启动步骤
protected void Start() - 在运行时开始时启动序列
主类需要 logic step 实现以下方法:
protected new bool NonBlocking
protected override void OnStarted
方法 nextStep() 必须在每个 logic step 完成后调用。(参见示例第 34 行)
(四)面向开发人员的 Motion
FixedUpdates 的顺序
在为驱动器开发自定义行为模型时,了解 FixedUpdates 的顺序对于确保正确的行为和性能至关重要。
(1)物理更新周期:所有Drive行为计算和新Drive位置的设置都在 Unity 的物理更新周期内进行。
默认情况下,此周期设置为 20 毫秒,但可以根据性能和计算要求在 Unity 设置中进行调整。
(2)FixedUpdate Sequence:Unity 在每个物理周期内对所有脚本执行 FixedUpdate 方法。
但是,不能保证这些 FixedUpdates 的执行顺序。
这意味着一个脚本 (Script1) 中的 FixedUpdate 可以在另一个脚本 (Script2) 中的 FixedUpdate 之前或之后调用。
(3)依赖关系管理:对于依赖于其他组件(例如 Gears 或 CAM)的行为模型,必须按特定顺序计算依赖关系。
例如,主 Drive 应该在其依赖的 slave Drive 之前计算。此外,在更新主 Drive 的位置之前,
需要处理 master Drive 的行为模型。
为了确保顺序正确,每个 Drive 都会实现以下行为:
(1)Drive Behavior Execution:每个 Drive 调用实现该接口的所有附加驱动器行为。
CalcFixedUpdateIDriveBehavior
(2)行为模型计算:附加的行为模型可以修改 Drive 的公共属性来控制其状态或直接设置 Drive 的状态。
CurrentPosition
(3)位置更新:然后,驱动器会将其位置更新为 。CurrentPosition
(4)Subdrive Calculations:Drive 的所有 Subdrives 都将调用其 CalcFixedUpdate(见下文)。
子驱动器
某些 Drive 用作 master Drive 的子驱动器,例如在 Gear 或 CAM 的情况下。
为了确保行为正确,这些驱动器需要实现接口。
此外,在该方法期间,子驱动器必须调用 .此设置可确保子驱动器不运行自己的 FixedUpdate,
而是等待主驱动器调用 CalcFixedUpdate,如上所述。
IDriveBehaviorStartMasterDrive.AddSubDrive(thisDrive)
设置驱动器位置
如前所述,在 Drive 和 Drive Behavior Execution 循环中,Drive Behavior 可以设置 public 属性 。
由于所描述的顺序,此方法可确保正确更新位置。CurrentPositio
驱动器上还有一个可用的 public 方法。调用此方法时,Drive 将再次设置其位置,
即使该 Drive 的上述序列已在同一 FixedUpdate 周期中完成。SetPosition(float position)
重要提示:不建议直接调用。
最好使用附加到 Drive 的行为模型中的接口来实现逻辑。
此方法可确保驱动器位置更新以受控且可预测的方式进行,并遵循既定的 FixedUpdates 序列。
SetPositionIDriveBehavior
驱动器事件
Drive 有两个关键事件,您可以利用它们来挂接到其更新序列中:
(1)OnBeforeDriveCalculation 方法:此事件在 Drive 开始计算其行为模型并更新其位置之前触发。
这是在 Drive 的主要计算发生之前注入自定义逻辑或进行调整的理想点。
(2)OnAfterDriveCalculation 中:在 Drive 完成所有行为模型计算并更新其位置之后,
但在计算任何 SubDrive 之前,将调用此事件。
这允许您在主驱动器更新后立即进行进一步修改或执行操作,但仍在整个更新序列内。
通过使用这些事件,您可以有效地将自定义行为或调整集成到 Drive 的更新过程中。

