为什么我在 TwinCAT3 中使用 ST 语言在 Modbus 任务中将其配置为 100 毫秒时,Wireshark 中的请求周期为 200 毫秒?

Why do I have a 200ms request period in Wireshark when I configure it for 100ms in the Modbus task, using ST language in TwinCAT3?

提问人:juanda_ 提问时间:10/30/2023 更新时间:10/31/2023 访问量:60

问:

我在 TwinCAT3 上创建一个程序,通过 Modbus-TCP 服务器 (192.168.2.16) 获取数据,以从其他 PC(从站:192.168.2.20)获取数据:

在此处输入图像描述

此外,我在 100 毫秒内创建并配置 modbus 服务器任务。 在此处输入图像描述

但是,我在 wireshark 中注意到请求周期约为 200 毫秒,而不是 100 毫秒。为什么周期是200ms?

在此处输入图像描述

我希望周期是相同的(100 毫秒)

Wireshark Twincat ST

评论

0赞 Community 10/31/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。
0赞 ziga 11/1/2023
对于以后的帖子,请尝试提供(可以格式化为显示为代码部分),而不是代码的图像。the code as text

答:

0赞 Steve 10/31/2023 #1

您的功能块需要多个周期才能运行。


解释

根据应用的不同,功能块可能需要多个周期才能完成,这就是为什么它们通常配置有:

  • b执行:功能块在此输入处的上升沿被激活
  • bBusy:在功能块运行时指示 TRUE

在您的情况下,我相信在您将 bExecute 设置为 TRUE 后,您会看到一个 bBusy 高的周期。当功能块需要与某些外部对象(如网络设备)通信时,通常会出现这种情况。


溶液

时序问题的推荐解决方案是减少周期时间(5/10ms 应该可以),然后在所需的周期时间上设置“bExecute”。 这允许功能块运行几个周期,并在开始新请求之前返回其数据。

评论

0赞 juanda_ 11/8/2023
嗨,@Steve,我很抱歉我迟到了。我只有一个循环任务(modbus)。当我在循环任务上放置 50 毫秒时,我在 wireshark 上得到 100 毫秒的请求周期。因此,周期任务和请求周期之间的关系是 2:1。但是,我不明白为什么请求周期不在周期任务周围。
0赞 juanda_ 11/8/2023
PROGRAM ModbusCommunication VAR fbMBReadCoils : FB_MBReadCoils; nReadValue : BYTE; END_VAR IF fbMBReadCoils.bBusy = FALSE AND fbMBReadCoils.bError = FALSE THEN fbMBReadCoils(sIPAddr:= '192.168.2.20', nTCPPort:= 1504, nUnitID:= 16#FF, nQuantity:= 1, nMBAddr:= 0, cbLength:= SIZEOF(nReadValue), pDestAddr:= ADR(nReadValue), bExecute:= TRUE, tTimeout:= , bBusy=> , bError=> , nErrId=> , cbRead=> ); ELSE fbMBReadCoils(bExecute:= FALSE); END_IF
0赞 Steve 11/8/2023
要考虑的重要方面是 FB 正在启动一个异步进程,以向设备发送消息,然后接收其响应。因此,它至少需要 2 个周期来执行其功能:1.将数据发送到异步进程,2.从异步进程读回数据。