
Сообщение от
Cs-Cs
PS. А не надо потом триггер записи в ПЧВ сбрасывать? Да, сам ПЛК запишет его по фронту, но а в коде не надо?
Можно его, например, обрабатывать через таймер TP и на время 500 ms поставить.
Да, надо, у меня все триггеры сбрасываются в начале каждого цикла. Это кусочек кода, относящийся к конкретной проблеме.
Также у меня там триггер поднимается по приходу сигнала об увеличении/уменьшении частоты.
И в первом цикле программы, чтоб при перезагрузке контроллера отправить нужную частоту на ПЧВ.
Из всего что относится к ПЧВ:
Код:
cycleCount := cycleCount + 1;
triggerFrequencySetOutputValue := FALSE;
IF cycleCount = 1 THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
pchvModbusErrorsComing(IN:= PChV1_M01.xError, PT:= modbusErrorTimeout);
pchvModbusConnectionError(IN:= pchvModbusErrorsComing.Q, PT:= modbusErrorSeriesTimeout);
fTrigPchvRestarted(CLK:= pchvModbusConnectionError.Q);
IF fTrigPchvRestarted.Q THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
IF frequencyUpSignal THEN
frequencySetOutputValue := frequencySetInputValue + frequencyStep;
triggerFrequencySetOutputValue := TRUE;
END_IF
IF frequencyDownSignal THEN
frequencySetOutputValue := frequencySetInputValue - frequencyStep;
triggerFrequencySetOutputValue := TRUE;
END_IF
P.S. Если что, нашел потом ошибку у себя. В счетчике циклов. При превышении верхнего лимита числового типа отсчет же снова начинается с единицы и происходят ненужные перезаписи частоты.
Нужно добавить такую проверку (заодно поменял тип с UINT на USINT), чтобы только в действительно первом цикле происходила запись.
Перескакивать сразу на цикл номер 2 по достижении верхнего предела
Код:
cycleCount: USINT := 0;
usintUpperLimit: USINT := 255;
IF cycleCount = usintUpperLimit THEN
cycleCount:= cycleCount + 3;
END_IF
Ну а вообще наверное нужно Кодсисовский метод FB_INIT() раскурить. Только о нем узнал. Похоже что он как раз для выполнения действий один раз при старте контроллера.