You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TwinCAT OPC UA:通过直接访问单独设置发布速率

TwinCAT OPC UA服务器分变量设置不同发布速率的实现方案

我已经配置了TwinCAT OPC UA服务器,需要对约400字节的关键变量实现1000Hz的高速循环数据交换。但如果在XML配置中为所有变量设置1ms发布速率,会导致CPU占用100%且通信失效。请问能否通过变量属性(如下方示例代码)为不同变量单独设置发布速率?

示例代码(ST变量定义)

{attribute 'OPC.UA.DA' := '1'}
//{datarate := 1000Hz}
CriticalData : Struct_of_CriticalData;
//{datarate := 10Hz} 
UncriticalData : Struct_of_UncriticalData;
{attribute 'OPC.UA.DA' := '0'}

当前OPC UA服务器XML配置

<?xml version="1.0"?>
<OpcServerConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UaServerConfig>
    <MaxRequestAge>0</MaxRequestAge>
    <MaxSessionCount>100</MaxSessionCount>
    <MinSessionTimeout>10000</MinSessionTimeout>
    <MaxSessionTimeout>3600000</MaxSessionTimeout>
    <MaxBrowseContinuationPoints>0</MaxBrowseContinuationPoints>
    <MaxHistoryContinuationPoints>0</MaxHistoryContinuationPoints>
    <MinPublishingInterval>1</MinPublishingInterval>
    <MaxPublishingInterval>0</MaxPublishingInterval>
    <MinKeepAliveInterval>5000</MinKeepAliveInterval>
    <MinSubscriptionLifetime>10000</MinSubscriptionLifetime>
    <MaxSubscriptionLifetime>0</MaxSubscriptionLifetime>
    <MaxRetransmitionQueueSize>10</MaxRetransmitionQueueSize>
    <MaxNotificationsPerPublish>0</MaxNotificationsPerPublish>
    <MaxDataQueueSize>100</MaxDataQueueSize>
    <MaxEventQueueSize>10000</MaxEventQueueSize>
    <MaxSubscriptionCount>0</MaxSubscriptionCount>
    <MaxMonitoredItemCount>0</MaxMonitoredItemCount>
    <MaxMonitoredItemPerSubscriptionCount>0</MaxMonitoredItemPerSubscriptionCount>
    <AvailableLocaleIds>
      <LocaleId>en</LocaleId>
    </AvailableLocaleIds>
    <AvailableServerProfiles>
      <ServerProfileUri>http://opcfoundation.org/UAProfile/Server/StandardUA</ServerProfileUri>
      <ServerProfileUri>http://opcfoundation.org/UAProfile/Server/DataAccess</ServerProfileUri>
      <ServerProfileUri>http://opcfoundation.org/UAProfile/Server/Methods</ServerProfileUri>
      <ServerProfileUri>http://opcfoundation.org/UAProfile/Server/EventSubscription</ServerProfileUri>
    </AvailableServerProfiles>
    <IsAuditActivated>false</IsAuditActivated>
    <RedundancySettings>
      <RedundancySupport>None</RedundancySupport>
    </RedundancySettings>
    <MinSupportedSampleRate>0</MinSupportedSampleRate>
    <AvailableSamplingRates>
      <SamplingRate>1</SamplingRate>
      <SamplingRate>2</SamplingRate>
      <SamplingRate>3</SamplingRate>
      <SamplingRate>4</SamplingRate>
      <SamplingRate>5</SamplingRate>
      <SamplingRate>6</SamplingRate>
      <SamplingRate>7</SamplingRate>
      <SamplingRate>8</SamplingRate>
      <SamplingRate>9</SamplingRate>
      <SamplingRate>10</SamplingRate>
      <SamplingRate>15</SamplingRate>
      <SamplingRate>20</SamplingRate>
      <SamplingRate>25</SamplingRate>
      <SamplingRate>30</SamplingRate>
      <SamplingRate>35</SamplingRate>
      <SamplingRate>40</SamplingRate>
      <SamplingRate>45</SamplingRate>
      <SamplingRate>50</SamplingRate>
      <SamplingRate>60</SamplingRate>
      <SamplingRate>70</SamplingRate>
      <SamplingRate>80</SamplingRate>
      <SamplingRate>90</SamplingRate>
      <SamplingRate>100</SamplingRate>
      <SamplingRate>150</SamplingRate>
      <SamplingRate>200</SamplingRate>
      <SamplingRate>250</SamplingRate>
      <SamplingRate>300</SamplingRate>
      <SamplingRate>350</SamplingRate>
      <SamplingRate>400</SamplingRate>
      <SamplingRate>450</SamplingRate>
      <SamplingRate>500</SamplingRate>
      <SamplingRate>550</SamplingRate>
      <SamplingRate>600</SamplingRate>
      <SamplingRate>650</SamplingRate>
      <SamplingRate>700</SamplingRate>
      <SamplingRate>750</SamplingRate>
      <SamplingRate>800</SamplingRate>
      <SamplingRate>850</SamplingRate>
      <SamplingRate>900</SamplingRate>
      <SamplingRate>950</SamplingRate>
      <SamplingRate>1000</SamplingRate>
      <SamplingRate>2000</SamplingRate>
      <SamplingRate>5000</SamplingRate>
      <SamplingRate>10000</SamplingRate>
    </AvailableSamplingRates>
</OpcServerConfig>

解决方案

可以通过TwinCAT变量属性配置结合OPC UA订阅分组实现差异化数据更新,具体操作如下:

  • 为变量配置采样速率属性
    TwinCAT支持使用{attribute 'OPC.UA.SamplingInterval' := 'X'}(X为毫秒数)为单个变量指定采样间隔,替代你示例中注释的自定义格式。注意取值必须在XML配置的AvailableSamplingRates列表内,你的配置已包含1和100,符合需求。修正后的ST代码:

    {attribute 'OPC.UA.DA' := '1'}
    {attribute 'OPC.UA.SamplingInterval' := '1'} // 1ms采样,对应1000Hz
    CriticalData : Struct_of_CriticalData;
    
    {attribute 'OPC.UA.SamplingInterval' := '100'} // 100ms采样,对应10Hz
    UncriticalData : Struct_of_UncriticalData;
    {attribute 'OPC.UA.DA' := '0'}
    
  • 客户端创建对应发布间隔的订阅
    服务器端的采样速率配置需要配合客户端的订阅设置才能生效:

    • 为CriticalData创建发布间隔为1ms的订阅
    • 为UncriticalData创建发布间隔为100ms的订阅
      这样服务器会根据订阅的发布间隔分配资源,避免全变量高速更新导致的CPU过载。
  • XML配置优化(可选)
    现有配置的MinPublishingInterval已设为1ms,满足高速需求,但可调整MaxDataQueueSize至200,提升高速数据的缓存能力,避免数据溢出:

    <MaxDataQueueSize>200</MaxDataQueueSize>
    

补充说明

  • TwinCAT OPC UA服务器不会自动为变量分配不同发布速率,必须结合客户端订阅配置实现差异化更新
  • 400字节关键变量在1000Hz下的带宽需求约为3.2Mbps,需确保网络带宽充足,避免通信瓶颈

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:20:27