2

我已经设置了第一个工厂 IO 教程场景,只有一个输入和一个输出(线圈)。我已将出厂 IO 配置为使用具有以下设置的“Modbus TCP/IP 服务器”:

Host:             127.0.0.1
Port:             502
Slave ID:         255
Network adapter:  Software Loopback Interface 1
All other values at default

我运行模拟并将其置于一个输入(传感器)应该返回一个值的状态。

在我的 TwinCAT 项目中,我有以下内容:

宣言:

PROGRAM MAIN
VAR
    LFB_MBReadInputs : FB_MBReadInputs;
    LFB_MBWriteCoils : FB_MBWriteCoils;
    inputs : ARRAY [0..15] OF BYTE; 
    coils : ARRAY [0..15] OF BYTE;
END_VAR

执行:

// Get the status of the inputs
LFB_MBReadInputs(
    sIPAddr := '127.0.0.1',
    nTCPPort := 502,
    nUnitID := 255,
    nQuantity := 16,
    nMBAddr := 0,
    cbLength := SIZEOF(inputs),
    pDestAddr := ADR(inputs),
    bExecute := TRUE,
    tTimeout := T#1S,
    bBusy => ,
    bError => ,
    nErrId => ,
    cbRead => ,
 );
LFB_MBReadInputs(bExecute := FALSE);

在 TwinCAT 中,我执行“激活配置”、“在运行模式下重新启动 TwinCAT”,登录,将程序下载到虚拟 PLC,然后点击开始。该程序似乎正在运行,但字节数组inputs显示全零。

我尝试切换到我的实际 IP 地址而不是家庭,我已将其从多个功能重构为仅一个“主”功能。我的代码错了吗?在 TwinCAT 或 Factory IO 中是否有一些我不知道的设置来允许它工作?

编辑:我已经在自己的回答中解释了问题的原因,那是因为我没有将 TCP/IP 插件安装到 TwinCAT。但是,将来可能会帮助某人知道当我检查“nErrId”字段时,我得到的值为“6”,根据文档,这意味着无法访问 Modbus 服务器。这就是导致我检查连接本身的原因,因为 IP 地址和端口是正确的。此外,最后我不得不切换到我的实际网络适配器而不是“软件环回接口”

4

2 回答 2

1

你必须给功能块时间来完成它的工作。通过在同一扫描中执行 FB bExecute:=truebExecute:=false它可能无法运行。尝试消除您的第二个LFB_MBReadInputs呼叫,并修改第一个以使用bExecute := NOT bBusy.

其中,指的是位,而FB_MBReadInputs是字节。因此,只会写入数组的前两个元素。在设备之间匹配 Modbus 地址可能很棘手。一个0 可能等同于另一个设备中的地址 100000 或 100001。正如@Roald 提到的,检查功能块中的错误代码。nQuantitycbLengthnMBAddr

于 2021-08-23T14:16:34.673 回答
0

很抱歉在这里回答我自己的问题,但感谢@kolyur 和@Roald,我设法让它工作。

我的问题是 TwinCAT PLC 无法看到在 Factory IO 中运行的 Modbus 服务器,因为 TCP/IP 连接未启用。我为 TwinCAT 下载了两个模块,一个用于 TCP/IP 客户端/服务器连接,一个用于 Modbus。然后,在我的项目中,我为它们生成了试用许可证并运行了我的项目。如果我在执行后检查错误代码字段并注意到错误代码表示它无法到达 Modbus 服务器,我可能会更早地诊断它。

于 2021-08-24T19:32:29.453 回答