Добрый день знатоки.
Разрабатываю на ПЛК-210-3 (но не суть). Опыта в работе именно на CODESYS маловато. Помогите решить задачу.
Суть: необходимо записывать параметры в серводрайвер по MODBUS. Запись осуществляется по переднему фронту переменной (GVL.stServo[roller_drive].stRWFlags.xWrIntPosReg3). В Приложении этим занимается отдельная задача с периодичностью 250 мс. После записи я опять-же по фронту переменной (GVL.stServo[roller_drive].stRWFlags.xRdIntPosReg3) считываю данные и проверяю соостветствие. Если данные совпадают - запись успешна, если нет - ОШИБКА. Код примерно такой :
CASE iCalcMarkSet OF
/// Записываем параметры в серво и проверяем корректность записи {{{
0:
GVL.stServo[roller_drive].stWrServo.stIntPos[3].unIntPos.dwDWORD :=
GVL.stServoDrivePrms[roller_drive].dwStretchLenInPos3;
GVL.stServo[roller_drive].stWrServo.stIntPos[3].wIntPosSPD :=
GVL.stServoDrivePrms[roller_drive].wRpmInPos3;
GVL.stServo[roller_drive].stRWFlags.xWrIntPosReg3 := TRUE;
iCalcMarkSet := 1;
1:
GVL.stServo[roller_drive].stRWFlags.xWrIntPosReg3 := FALSE;
GVL.stServo[roller_drive].stRWFlags.xRdIntPosReg3 := TRUE;
iCalcMarkSet := 2;
2:
GVL.stServo[roller_drive].stRWFlags.xRdIntPosReg3 := FALSE;
xErrWrMarkSetPrms := FALSE;
IF GVL.stServo[roller_drive].stRdServo.stIntPos[3].unIntPos.dwDWORD = GVL.stServoDrivePrms[roller_drive].dwStretchLenInPos3
AND GVL.stServo[roller_drive].stRdServo.stIntPos[3].wIntPosSPD = GVL.stServoDrivePrms[roller_drive].wRpmInPos3 THEN
iCalcMarkSet := 3;
ELSE
xErrWrMarkSetPrms := TRUE;
iCalcMarkSet := -1;
stBtnState.xBtn.MarkSet := FALSE;
END_IF
3:

Вопросов несколько:
1. МОжно ли проверить успешность записи флагами самого MODBUS и если да - как это сделать?
2. Т.к. я записываю данные множество раз - хочу реализовать функцию (или функциональный блок). Но не хочу использовать циклов (очень нежелательно). Как это правильно сделать - использовать VAR_STAT тоже не хочется, вызывать несколько раз функцию- вызвал, записал данные, взвел флаг записи. Снова вызвал - снял флаг, снова вызвал - взвел флаг чтения ну и так далее.
Подскажите - как оптимально решить задачу такого рода?
Заранее признателен