我想通过MODBUS在PLC上发布一个DINT变量(dintTest(,以便使用Matlab仪器控制工具箱读取它。事实证明,Matlab可以读取Modbus变量,但只能读取INT16。所以我想在IEC中将DINT变量拆分为两个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;
我最好将DINT拆分为2个单词的
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中重新构建它。
这里的重点不是使用数学,而是使用位掩码。