Просмотр полной версии : Запись в регистры СП310-Р с помощью ПЛК200 в режиме Master по Modbus TCP
kostyachirko375
15.09.2026, 09:29
Необходимо реализовать синхронизацию времени панели СП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 ?
Заранее спасибо.
Иван Билык
15.09.2026, 11:17
Можете обратиться по этому вопросу в поддержку ОВЕН - support@owen.ru
kondor3000
15.09.2026, 12:07
Необходимо реализовать синхронизацию времени панели СП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?t=38239&page=20#200
Ниже пример наоборот, время берётся в панели, там же конвертируется в DEC с помощью ГМ макросов и отправляется в реле ПР200, с 512 по 517 адреса, от года до секунд -6 регистров.
Ещё пример записи из ПЛК мастера в панель слейв, 6 регистрами, адреса 500-505, с конвертацией прямо в панели ГМ макросом.
Проверить проекты можно даже в Офф- лайн эмуляции.
Евгений Кислов
16.09.2026, 07:05
Добрый день.
Возможно, это видео и проект окажутся полезными:
https://ftp.owen.ru/CoDeSys3/99_ForumFiles/SyncTimeWithSP310.mp4
https://ftp.owen.ru/CoDeSys3/99_ForumFiles/Example_SyncTimeWithSP310_3517v1.projectarchive
kostyachirko375
17.09.2026, 09:14
Спасибо всем кто откликнулся. Задача решена.
Добавляешь устройство 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
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot