【问题标题】:How do I programm a PC as a PLC that has registers that are readable via Modbus using Beckhoff Twin CAT 3 TCP Modbus?如何使用 Beckhoff Twin CAT 3 TCP Modbus 将 PC 编程为具有可通过 Modbus 读取的寄存器的 PLC?
【发布时间】:2022-07-04 21:44:56
【问题描述】:

我想使用 Beckhoff Twin CAT 3 TCP Modbus 模块在 PC 中制作寄存器,该 PC 作为 PLC 运行,可通过 Modbus 读取。 我已经从 Backhoff 网站下载了 Modbus TCP 功能。我已按照第 55 页 Manual TF6250 TwinCAT 3 | Modbus TCP 中的示例进行操作。当我尝试使用 modbus 客户端读取地址为 0x3000 的寄存器时,出现地址无效错误。

代码如下:

PROGRAM MAIN
    VAR
        ipAddr : STRING(15) := '';
        nValue AT%MB0 : ST_EM_Ausgangsdaten_Float;
        fbWriteRegs : FB_MBWriteRegs;
        bWriteRegs : BOOL;
    END_VAR
IF NOT bWriteRegs THEN
    nValue.BlindleistungL1 := nValue.BlindleistungL1+1;
    nValue.BlindleistungL2 := nValue.BlindleistungL2+1;
    nValue.BlindleistungL3 := nValue.BlindleistungL3+1;
    
    bWriteRegs :=TRUE;
    fbWriteRegs.sIPAddr :=ipAddr;
    fbWriteRegs.nQuantity := 1;
    fbWriteRegs.nMBAddr := 16#3000;
    fbWriteRegs.cbLength := SIZEOF(nValue);
    fbWriteRegs.pSrcAddr := ADR(nValue);
    fbWriteRegs.tTimeout := T#5S;
    fbWriteRegs(bExecute:=TRUE);
ELSE
    IF NOT fbWriteRegs.bBUSY THEN
        bWriteRegs :=FALSE;
    END_IF
    fbWriteRegs(bExecute:=FALSE);
END_IF

谁能告诉我如何通过 Modbus 读取 PLC 中的变量。

【问题讨论】:

  • 愚蠢的问题:您确定您正在读取的地址存在于 PLC 的内存映射中吗?您是否尝试过阅读其他确实存在的地址?无效地址错误通常意味着,嗯……地址错误。
  • 您的问题为我指明了正确的方向。我必须将我的变量映射为全局变量,这样它们就可以访问了。
  • 太好了,我很高兴我的评论很有用。祝你的项目好运。

标签: plc twincat modbus-tcp structured-text


【解决方案1】:

如果我正确理解您的问题,您想要运行 Modbus TCP 服务器(从您的 cmets 看来,您已经运行了一些东西,但您可能不明白为什么)。

我相信您知道这一点,但 Modbus TCP 的工作原理是客户端发出 Modbus 命令以向/从 Modbus 服务器读取/写入数据,并且服务器以数据(或成功)响应。 TF6250 通信模块允许您通过几种方式做到这一点。


您遇到的第一个问题是您实现的第 55 页上的示例代码是针对“FB_MBWriteRegs”函数的。这是您的程序充当 Modbus 客户端(而不是服务器)的功能。它正在尝试连接到远程服务器并将数据写入该服务器上的 Modbus 地址。手册中的描述可能不是最好的,我可以看出它可能会产生误导。

在您的情况下(如示例代码中所示),STRING ipAddr 为空。如果您的 fbWriteRegs 报告错误,我不会感到惊讶。您可以通过检查 fbWriteRegs.bError 和 fbWriteRegs.nErrId 标签的值来检查这一点。

要使此代码正常工作,您需要连接到现有的 Modbus TCP 服务器并填充正确的 IP 地址。

此外,我不知道“ST_EM_Ausgangsdaten_Float”是什么数据类型,但鉴于此函数用于写入输出寄存器,如果那里也有问题,我不会感到惊讶。

无论如何,这不是您想要做的。我想您会发现,如果您删除/删除此代码并将您的变量映射为全局变量,它仍然会“工作”。


您可能感兴趣的是第 4.2 节和第 4.3 节。

TF6250 安装一个充当 Modbus TCP 服务器的 Windows 应用程序。该服务器充当 Modbus 到 ADS 转换器,通过 ADS 将 Modus 寄存器中的值映射到 PLC 内存区域。

您可以从 TwinCAT Modbus TCP 配置工具访问 Modbus TCP 服务器的配置和映射。对于 Windows,这通常位于“C:\TwinCAT3\Functions\TF6250-Modbus-TCP”目录中。 (对于 Twicat/BSD 来说,这是一个完全不同的过程)。

配置应用如下所示;

如果您单击“获取配置” - 等待一段时间,直到它加载,然后“导出配置”,您可以将映射/配置保存在 XML 文件中。

默认映射显示在第 19 页的第 4.3 节中,我怀疑您当前的工作方式。

如果您想直接映射到内存区域而不是通过全局映射,您需要知道您的 IndexGroup 和 Index Offset available herehere注意:我知道这种映射方式可以提高大量数据的性能,但我还没有测试过。

您可以为所需的映射操作 XML 文件。但是,如果您能够选择您喜欢的任何内存区域,我会保留您想要做的默认配置并删除其余配置,然后我会将我的数据映射到适当的 TwinCAT 内存区域,但这完全是由你决定。

修改完 XML 文件后,可以使用配置工具“导入配置”选择修改后的 XML 文件,然后“设置配置”更新映射。

然后您应该能够使用 Modbus Clinet 连接到您的 Modbus 服务器,并确切知道哪些数据正在写入哪个 Modbus 地址以及内存区域(%M、%Q、%I 等...)

祝你好运!

【讨论】:

    最近更新 更多