Посмотрите, пожалуйста, пристально на такой код.
Первая же команда 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