Разделить IEC 61131-3 DINT на две переменные INT (структурированный текст ПЛК) - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу опубликовать переменную DINT (dintTest) через MODBUS на ПЛК, чтобы прочитать ее с помощью Matlab Instrument Control Toolbox. Оказывается, Matlab может читать переменные Modbus, но только INT16. Поэтому я хочу разделить переменную DINT на две переменные INT в IEC. Я нашел это решение, но это позволяет только значения от + - 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? Спасибо!

редактировать: Я читаю с функциональным блоком Matlab в Simulink (требуется Toolbox 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 голосов
/ 19 ноября 2018

Я бы лучше разделил 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.

Дело здесь не в математических, а в битовых масках.

...