Показано с 1 по 10 из 1642

Тема: CODESYS V3.5. Настройка обмена с другими устройствами (Modbus, ОВЕН, OPC и др.)

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Да! Это оно! Единственное неудобство в том, что на момент ошибки xError становится TRUE, а при следующей попытке опроса сбрасывается на FALSE.
    Я у себя в статье как раз это описал (ради этого стоит почитать) и показал, как сделал систему выдержки на паре таймеров.
    Её суть такая, образно: "Одна ошибочка появилась - значит, глюк. О, а если пошли несколько ошибок подряд - то это точно отвал связи".
    Все, разобрался. Набросал быстренько пока такой код. Работает. Спасибо!

    Код:
    pchvModbusErrorsComing: TOF;
    pchvModbusConnectionError: TON;
    modbusErrorTimeout: TIME:= T#1000MS;
    modbusErrorSeriesTimeout: TIME:= T#3000MS;
    fTrigPchvRestarted: F_TRIG;
    
    
    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

  2. #2

    По умолчанию

    Цитата Сообщение от edvard_munch Посмотреть сообщение
    Все, разобрался. Набросал быстренько пока такой код. Работает. Спасибо!
    О, класс! Наконец-то кто-то внимательно прочитал ту мою статью, ахаха (спасибо, мне приятно что в дело пошло)!
    Отлично! В будущем это можно, как у меня, запихать в функциональный блок, и для разных устройств создавать его экземпляры!
    PS. А не надо потом триггер записи в ПЧВ сбрасывать? Да, сам ПЛК запишет его по фронту, но а в коде не надо?
    Можно его, например, обрабатывать через таймер TP и на время 500 ms поставить.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  3. #3

    По умолчанию

    Цитата Сообщение от 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() раскурить. Только о нем узнал. Похоже что он как раз для выполнения действий один раз при старте контроллера.
    Последний раз редактировалось edvard_munch; 18.06.2024 в 16:56.

Похожие темы

  1. Настройка ПР200, управление 3-мя устройствами через RS-485
    от Orbes в разделе Среда программирования OWEN Logic
    Ответов: 20
    Последнее сообщение: 15.05.2017, 16:45
  2. СП3ХХ Пример настройка обмена с ПЛК на CODESYS 2.3
    от Denis_Kay в разделе Панели оператора (HMI)
    Ответов: 6
    Последнее сообщение: 02.03.2017, 15:12
  3. Ответов: 43
    Последнее сообщение: 13.04.2015, 14:05
  4. Универсальная функция для обмена с устройствами OwenIO и всеми любимый LabView.
    от Алексей Крагель в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 30.05.2014, 13:38

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •