0

我想在 PLC 上通过 MODBUS 发布一个 DINT 变量(dintTest),以使用 Matlab 仪器控制工具箱读取它。事实证明,Matlab 可以读取 Modbus 变量,但只能读取 INT16。所以我想将 DINT 变量拆分为 IEC 中的两个 INT 变量。我找到了这个解决方案,但这只允许 +- 0 ... 32767^2 的值:

dintTest := -2;

b := dintTest MOD 32767;
a := dintTest / 32767;
result := 32767 * a + b;

c := DINT_TO_INT(b); // publish over modbus
d := DINT_TO_INT(a); // publish over modbus

整个 DINT 范围的解决方案是什么?谢谢!

编辑:我在 simulink 中使用 matlab 功能块阅读(需要仪器控制工具箱):

function Check = MBWriteHoldingRegs(Values,RegAddr)
coder.extrinsic('modbus');
m = modbus('tcpip', '192.169.237.17');
coder.extrinsic('write');
write(m,'holdingregs',RegAddr,double(Values),'int16');
Check = Values;
4

1 回答 1

0

我最好将 DINT 拆分为 2 个 WORD

VAR
    diInt: DINT := -2;
    dwTemp: DWORD;
    w1: WORD;
    w2: WORD;
END_VAR


dwTemp := DINT_TO_DWORD(diInt);

w1 := DWORD_TO_WORD(dwTemp);
w2 := DWORD_TO_WORD(SHR(dwTemp, 16));

然后我可以在matlab中重新构建它。

这里的重点不是使用数学而是位掩码。

于 2018-11-19T07:36:01.983 回答