Посмотрите, пожалуйста, пристально на такой код.
Первая же команда PRU_FB_GetParameter(pru_num:=0, index:=28, value:=ADR(TMP)) уводит ПЛК в перезагрузку.
ADR(TMP) используется нормально?
Вроде, тут POINTER TO DWORD, и ADR я применяю только к DWORD переменным. С выравниванием всё ок? Или нужны какие-то песни-пляски?
Второе подозрение у меня на то, что, возможно, прошивка ПЛК поддерживает только 1 dword на обмен с PRU, а я пытаюсь 5 dword'ов синхронизировать.
Код:
FUNCTION_BLOCK PRU_PULSE
VAR_INPUT
ENABLE: BOOL;
CYCLE_LENGTH: WORD; (* PRU cycles *)
QUANTITY: DWORD;
END_VAR
VAR_OUTPUT
READY : BOOL;
QUANTITY_LEFT: DWORD; (* for debugging *)
END_VAR
VAR
TMP: DWORD;
END_VAR
..
PRU_FB_GetParameter(pru_num:=0, index:=28, value:=ADR(TMP));
READY := TMP <> 0;
PRU_FB_GetParameter(pru_num:=0, index:=29, value:=ADR(QUANTITY_LEFT));
PRU_FB_SetParameter(pru_num:=0, index:=25, value:=ADR(QUANTITY));
TMP := WORD_TO_DWORD(CYCLE_LENGTH);
PRU_FB_SetParameter(pru_num:=0, index:=26, value:=ADR(TMP));
TMP := SEL(ENABLE, 0, 1);
PRU_FB_SetParameter(pru_num:=0, index:=27, value:=ADR(TMP));
Собственно, определения функций get/set из pruAccessLib.lib:
Код:
FUNCTION PRU_FB_GetParameter : DINT
VAR_INPUT
pru_num:DWORD; (*from 0 to 1*)
index:DWORD; (*from 2 to 31*)
value: POINTER TO DWORD;
END_VAR
VAR
END_VAR
Код:
FUNCTION PRU_FB_SetParameter : DINT
VAR_INPUT
pru_num:DWORD; (*from 0 to 1*)
index:DWORD; (*from 2 to 31*)
value: POINTER TO DWORD;
END_VAR
VAR
END_VAR