首页 文章

将IEC 61131-3 DINT拆分为两个INT变量(PLC结构化文本)

提问于
浏览
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功能块读取(需要Instrument Control Toolbox):

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;

1 回答

  • 0

    我最好把DINT分成两个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中重新构建它 .

    这里的要点不是使用数学而是使用位掩码 .

相关问题