我已经设置了第一个工厂 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 地址和端口是正确的。此外,最后我不得不切换到我的实际网络适配器而不是“软件环回接口”