Показано с 1 по 5 из 5

Тема: Запись в регистры СП310-Р с помощью ПЛК200 в режиме Master по Modbus TCP

  1. #1

    По умолчанию Запись в регистры СП310-Р с помощью ПЛК200 в режиме Master по Modbus TCP

    Необходимо реализовать синхронизацию времени панели СП310-Р с временем ПЛК200. Нашел пример конфигурации панели на странице ОВЕН СП3xx https://owen.ru/uploads/182/sp307_synctime.zip
    Там есть необходимость записывать в регистры панели, а как это сделать я совсем не представляю.
    В разделе добавления устройства в Modbus_TCP_Master нет шаблона для панели оператора СП310-Р. Единственное, что похожее есть - это Веб-панель VP 110.
    Панель СП310-З в CODESYS нужно настраивать в соответствии с этим видео https://youtu.be/Bd6HQKTjLn4?si=yC6UWnqg7mw6Ym-d ?
    Заранее спасибо.
    Изображения Изображения

  2. #2

    По умолчанию

    Можете обратиться по этому вопросу в поддержку ОВЕН - support@owen.ru

  3. #3

    По умолчанию

    Цитата Сообщение от kostyachirko375 Посмотреть сообщение
    Необходимо реализовать синхронизацию времени панели СП310-Р с временем ПЛК200. Нашел пример конфигурации панели на странице ОВЕН СП3xx https://owen.ru/uploads/182/sp307_synctime.zip
    Там есть необходимость записывать в регистры панели, а как это сделать я совсем не представляю.
    В разделе добавления устройства в Modbus_TCP_Master нет шаблона для панели оператора СП310-Р. Единственное, что похожее есть - это Веб-панель VP 110.
    Панель СП310-З в CODESYS нужно настраивать в соответствии с этим видео https://youtu.be/Bd6HQKTjLn4?si=yC6UWnqg7mw6Ym-d ?
    Заранее спасибо.
    Для панели СП310, в ПЛК создайте мастер ТСР, в нём слейв и регистры начиная с 256 адреса, хоть 10- 120 штук и передавайте что угодно. Чтение функция 0х03, запись 0х10 (0х06)
    В панели есть системные регистры PSW30 -PSW35, от года до секунд. Но записать туда надо числа в формате BCD (HEX).
    Передать время вы можете в регистры, например PSW300-PSW305, убедиться, что передано правильно, а потом, например по биту
    записать в PSW30 -PSW35. Либо записать напрямую в в PSW30 -PSW35.

    Функции (ФБ) конвертации времени в ПЛК, есть в биб-ках или здесь
    Конвертация времени BCD формата панелей, HEX в DEC и обратно DEC в HEX https://owen.ru/forum/showthread.php...39&page=20#200

    Ниже пример наоборот, время берётся в панели, там же конвертируется в DEC с помощью ГМ макросов и отправляется в реле ПР200, с 512 по 517 адреса, от года до секунд -6 регистров.

    Ещё пример записи из ПЛК мастера в панель слейв, 6 регистрами, адреса 500-505, с конвертацией прямо в панели ГМ макросом.
    Проверить проекты можно даже в Офф- лайн эмуляции.
    Вложения Вложения
    Последний раз редактировалось kondor3000; 15.09.2026 в 19:07.

  4. #4

  5. #5

    По умолчанию

    Спасибо всем кто откликнулся. Задача решена.
    Добавляешь устройство Modbus_TCP_Master, в него уже Modbus_TCP_Slave. Создаем два канала для записи в регистры СП310-Р:
    канал 0 - для записи PSB регистра, передний фронт которого триггерит макрос синхронизации времени в СП310-Р, Modbus функция записи - Write Single Coil (Код функции 05) (Видео с реализацией https://youtu.be/elizZ9l_-sw?si=RxBhQcyMJ1rJ-C_Z и архив проекта https://ftp.owen.ru/CoDeSys3/99_Foru...projectarchive).
    канал 1 - для записи группы регистров (Год, месяц, день, часы, минуты...). Write Multiple Registers (Код функции 16).
    Остается дело за малым, а именно написать код, который бы выполнял синхронизацию раз в час.
    // Область переменных
    PROGRAM PLC_PRG
    VAR

    iStep: INT := 0; // Шаг автомата

    // По переднему фронту инициируется синхронизация времени
    xStartSync: BYTE;
    wYear: WORD;
    wMonth: WORD;
    wDay: WORD;
    wHour: WORD;
    wMinute: WORD;
    wSecond: WORD;
    // Опрос Modbus slave
    fbModbusChannel: IoDrvModbusTCP.ModbusChannel;
    xTrigger: BOOL;
    xExecute: BOOL;
    fbTimeSyncTimer: TON;
    iChannelIndex: INT;

    fbStartDelay: TON;
    xFirstCycle: BOOL := TRUE;
    END_VAR
    VAR CONSTANT
    i_Channel_0: INT := 0;
    i_Channel_1: INT := 1;
    // Период синхронизации времени
    tTimeSyncPeriod: TIME := T#1H;
    END_VAR

    //-----------------------------------------------------------------------------

    // Область кода
    fbTimeSyncTimer(
    IN := (iStep = 0),
    PT := tTimeSyncPeriod
    );

    // НОВЫЙ ТАЙМЕР: Задержка 2 секунды после включения ПЛК для инициализации сети
    fbStartDelay(
    IN := TRUE,
    PT := T#2S
    );

    // 2. Вызов функционального блока Modbus ВСЕГДА на каждом цикле
    fbModbusChannel(
    slave := Modbus_TCP_Slave,
    xExecute := xExecute,
    iChannelIndex := iChannelIndex
    );

    // 3. Пошаговый автомат синхронизации
    CASE iStep OF

    0: // Ожидание срабатывания таймера ИЛИ первого старта
    xExecute := FALSE;

    IF fbTimeSyncTimer.Q OR (xFirstCycle AND fbStartDelay.Q) THEN

    IF xFirstCycle THEN
    xFirstCycle := FALSE;
    END_IF

    // Получение текущего времени из контроллера
    wYear := TargetVars.stRtc.uiGetYear MOD 100;
    wMonth := TargetVars.stRtc.usiGetMonth;
    wDay := TargetVars.stRtc.usiGetDay;
    wHour := TargetVars.stRtc.usiGetHour;
    wMinute := TargetVars.stRtc.usiGetMinute;
    wSecond := TargetVars.stRtc.usiGetSecond;

    iStep := 10;
    END_IF

    10: // ШАГ 1: Запись значений времени (Channel 1)
    iChannelIndex := i_Channel_1;
    xExecute := TRUE; // Даем команду на отправку

    // Ждем завершения операции
    IF fbModbusChannel.xDone THEN
    xExecute := FALSE; // Сбрасываем execute перед следующим шагом
    xStartSync := 1; // Выставляем флаг синхронизации для панели
    iStep := 20;
    ELSIF fbModbusChannel.xError THEN
    xExecute := FALSE;
    iStep := 999; // Обработка ошибки
    END_IF

    20: // Пауза в 1 цикл для сброса фронта xExecute у ФБ
    xExecute := FALSE;
    iStep := 30;

    30: // ШАГ 2: Отправка команды "Применить время" (Channel 0)
    iChannelIndex := i_Channel_0;
    xExecute := TRUE;

    IF fbModbusChannel.xDone THEN
    xExecute := FALSE;
    xStartSync := 0; // Сбрасываем флаг синхронизации
    iStep := 0; // Возврат в начало, таймер fbTimeSyncTimer начнет отсчет заново
    ELSIF fbModbusChannel.xError THEN
    xExecute := FALSE;
    iStep := 999;
    END_IF

    999: // Ошибка обмена (например, панель еще не загрузилась)
    xExecute := FALSE;
    xStartSync := 0;

    // Если при первом старте произошла ошибка связи, мы НЕ сбрасываем xFirstCycle.
    // Автомат попробует снова синхронизироваться на следующем цикле (через шаг 0),
    // не дожидаясь tTimeSyncPeriod, пока связь наконец-то не установится успешно.
    xFirstCycle := TRUE;

    iStep := 0; // Возврат в начало

    END_CASE

Похожие темы

  1. ПЛК200 Modbus TCP Master и Slave на одном порту
    от Ovtia в разделе ПЛК2хх
    Ответов: 2
    Последнее сообщение: 02.12.2023, 21:25
  2. Ошибки 85,89 ПЛК110 в режиме Modbus RTU Master.
    от Borobeska в разделе ПЛК1хх [М02]
    Ответов: 8
    Последнее сообщение: 17.05.2023, 08:46
  3. Ответов: 16
    Последнее сообщение: 04.11.2022, 19:33
  4. Ответов: 23
    Последнее сообщение: 03.12.2018, 13:26
  5. Чтение/запись данных по Modbus панели СП310
    от _Алексей_ в разделе СП3хх, СП270
    Ответов: 7
    Последнее сообщение: 29.08.2018, 07:43

Метки этой темы

Ваши права

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