【问题标题】:How to set 1 isolated core in TwinCAT如何在 TwinCAT 中设置 1 个隔离核心
【发布时间】:2020-12-11 22:13:29
【问题描述】:

我必须通过 c# 代码在 TwinCAT 中设置一个独立的内核。在线文档中显示了如何设置核心数量、基准时间、核心限制和延迟警告,但没有关于隔离核心的数量。

public void AssignCPUCores()
{
    ITcSysManager3 systemManager = project.Object;
    ITcSmTreeItem realtimeSettings = systemManager.LookupTreeItem("TIRS");
    string xml = null;
    MemoryStream stream = new MemoryStream();
    StringWriter stringWriter = new StringWriter();
    using (XmlWriter writer = XmlTextWriter.Create(stringWriter))
    {
        writer.WriteStartElement("TreeItem");
        writer.WriteStartElement("RTimeSetDef");
        writer.WriteElementString("MaxCPUs", "4"); //  looking at what changes in TwinCAT by changing this number, 
                                                 // I found out that this number is the number of shared cores 
        
        string affinityString = string.Format("#x{0}", ((ulong)CpuAffinity.MaskDual).ToString("x16"));
                        //the MaskDual/MaskQuad/MaskSingle defines how many boxes will be checked (i.e. how many cores will be used)

        writer.WriteElementString("Affinity", affinityString);
        writer.WriteStartElement("CPUs");

        //    WriteCpuProperties(writer, int coreId , int loadLimit, int baseTime, latencyWarning)
        WriteCpuProperties(writer, 0, 90, 1000, 0);

        writer.WriteEndElement();     // CPUs     
        writer.WriteEndElement();     // RTimeSetDef     
        writer.WriteEndElement();     // TreeItem
    }
    xml = stringWriter.ToString();
    realtimeSettings.ConsumeXml(xml);  //here modifies are applied
    ITcSmTreeItem tasks = systemManager.LookupTreeItem("TIRT");
    
    SetTaskProperties(tasks, CpuAffinity.CPU1);
}

似乎没有办法设置隔离核心。有没有可能? 目标是获得这样的东西:

但是抛出 c# 代码,隔离核心的数量为 0,并且所有核心在括号之间都有(共享)。

【问题讨论】:

    标签: c# cpu twincat


    【解决方案1】:

    我认为这是不可能的。通常,当隔离核心的数量发生变化时,需要重新启动才能生效。如果您可以在不重新启动的情况下使用您的代码执行此操作,我会感到惊讶。

    【讨论】:

    • 正确,但仅当您第一次设置独立核心时才需要重新启动。并且当创建另一个项目时,它会返回默认选项(1 个共享核心),但操作系统仍然会看到少一个核心。实际上,如果您再次设置最后一个隔离的核心,则不需要重新启动。所以我希望有一种方法可以自动实现
    • 好的。那时我还不清楚这个问题。也许你可以尝试改写它。
    【解决方案2】:

    独立内核设置在机器上,独立于您的代码。一些配置被写入除 windows 之外运行的 PLC。 PLC 在启动时声称拥有一个核心,而 Windows 则少看 1 个核心。您必须重新启动才能激活(隔离的)核心配置。

    当您运行 plc 程序时,您可以指定程序应该在哪些内核上运行。问题在于,当存在和不存在隔离内核时,TwinCAT 的行为会有所不同。

    当存在隔离内核时,TwinCAT 强制要求与内核配置完全匹配。 所以你的程序必须读取核心配置,在需要时改变它并写回它。这样,无论 CPU 配置如何,您都可以在任何 plc 中加载您的 plc 程序。

    这不是微不足道的,而是可以做到的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多