为什么我的 TwinCAT 3 项目中没有通过 Modbus 从 Factory IO 接收到任何数据?
Why do I not receive any data from Factory IO in my TwinCAT 3 project through Modbus?
我已经建立了第一个工厂 IO 教程场景,只有一个输入和一个输出(线圈)。我将 Factory 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,然后点击启动。该程序似乎是 运行ning,但字节数组 inputs
显示全为零。
我试过切换到我的实际 IP 地址而不是家庭地址,我已经将它从多个功能重构为只有一个“主要”功能。我的代码错了吗?在 TwinCAT 或 Factory IO 中是否有一些我不知道的设置允许它工作?
编辑:我已经在我自己的回答中解释了我的问题的原因,那是因为我没有为 TwinCAT 安装 TCP/IP 插件。但是,当我检查“nErrId”字段时,我得到的值是“6”,这可能会帮助将来的人知道,根据文档,这意味着无法访问 Modbus 服务器。这就是导致我检查连接本身的原因,因为 IP 地址和端口是正确的。另外,最后我不得不切换到我的实际网络适配器而不是“软件环回接口”
你必须给功能块时间来完成它的工作。通过在同一扫描中使用 bExecute:=true
和 bExecute:=false
执行 FB,它可能无法 运行。尝试消除第二个 LFB_MBReadInputs
调用,并将第一个调用修改为使用 bExecute := NOT bBusy
.
和FB_MBReadInputs
一样,nQuantity
是指位,而cbLength
是字节。因此,只会写入数组的前两个元素。在设备之间匹配 Modbus 地址可能很棘手。 0 的 nMBAddr
可能等同于其他设备中的地址 100000 或 100001。正如@Roald 提到的,检查功能块中的错误代码。
很抱歉在这里回答我自己的问题,但感谢@kolyur 和@Roald,我设法让它工作了。
我的问题是 TwinCAT PLC 无法在工厂 IO 中看到 Modbus 服务器 运行,因为 TCP/IP 连接未启用。我为 TwinCAT 下载了两个模块,一个用于 TCP/IP client/server 连接,一个用于 Modbus。然后,在我的项目中,我为它们和 运行 我的项目生成了试用许可证。如果我在执行后检查错误代码字段并注意到错误代码表示它无法到达 Modbus 服务器,我可能会更快地诊断出来。
我已经建立了第一个工厂 IO 教程场景,只有一个输入和一个输出(线圈)。我将 Factory 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,然后点击启动。该程序似乎是 运行ning,但字节数组 inputs
显示全为零。
我试过切换到我的实际 IP 地址而不是家庭地址,我已经将它从多个功能重构为只有一个“主要”功能。我的代码错了吗?在 TwinCAT 或 Factory IO 中是否有一些我不知道的设置允许它工作?
编辑:我已经在我自己的回答中解释了我的问题的原因,那是因为我没有为 TwinCAT 安装 TCP/IP 插件。但是,当我检查“nErrId”字段时,我得到的值是“6”,这可能会帮助将来的人知道,根据文档,这意味着无法访问 Modbus 服务器。这就是导致我检查连接本身的原因,因为 IP 地址和端口是正确的。另外,最后我不得不切换到我的实际网络适配器而不是“软件环回接口”
你必须给功能块时间来完成它的工作。通过在同一扫描中使用 bExecute:=true
和 bExecute:=false
执行 FB,它可能无法 运行。尝试消除第二个 LFB_MBReadInputs
调用,并将第一个调用修改为使用 bExecute := NOT bBusy
.
和FB_MBReadInputs
一样,nQuantity
是指位,而cbLength
是字节。因此,只会写入数组的前两个元素。在设备之间匹配 Modbus 地址可能很棘手。 0 的 nMBAddr
可能等同于其他设备中的地址 100000 或 100001。正如@Roald 提到的,检查功能块中的错误代码。
很抱歉在这里回答我自己的问题,但感谢@kolyur 和@Roald,我设法让它工作了。
我的问题是 TwinCAT PLC 无法在工厂 IO 中看到 Modbus 服务器 运行,因为 TCP/IP 连接未启用。我为 TwinCAT 下载了两个模块,一个用于 TCP/IP client/server 连接,一个用于 Modbus。然后,在我的项目中,我为它们和 运行 我的项目生成了试用许可证。如果我在执行后检查错误代码字段并注意到错误代码表示它无法到达 Modbus 服务器,我可能会更快地诊断出来。