[?] Програмная инициализация DB.

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Post Reply
dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

[?] Програмная инициализация DB.

Post by dmitry_79 » Fri Feb 18, 2011 7:09 pm

Есть необходимость по какому-то событию производить инициализацию всех DB. Прочитал Бергера про рестарт CPU - запутался...

Согласно приведенной ниже странице разница между "холодным" и "полным" рестартами получается только в сбросе данных: в первом случае это несохраняемые, во втором - данные пользователя ... а в чем разница между этими данными? Переменные данные DB к чему относятся?

Image

Далее: как вызвать эти самые ОB100, OB101, OB102 ? Есть ли иной способ провести инициализацию как отдельно взятого DB, так и всех блоков программы пользователя?
Конкретный случай - СPU S7-315, но про S7-400 тоже хотел бы услышать мнение специалистов.

Спасибо за помощь!

CHANt
Posts: 501
Joined: Tue Jun 27, 2006 5:52 am
Location: Russia

Re: [?] Програмная инициализация DB.

Post by CHANt » Fri Feb 18, 2011 9:03 pm

Для 300 серии актуальны:
Холодный пуск. При этом сбрасываются все данные и сохраняемые и не сохраняемые, и DB. Такой пуск можно произвести только из режима PG в окне оперативного управления. Либо после MRES, хотя это несколько больше :)
Теплый пуск (новый пуск) - сбрасываются только не сохраняемые данные. Данные в DB сохраняются. Переключателем RUN->STOP выполняется.
Для 400 серии еще добавляется горячий пуск. Соответственно сохраняются все данные и программа начинается с места останова.Также, такой пуск можно произвести только из режима PG в окне оперативного управления.
ОВ100 для теплого пуска. ОВ101 для горячего пуска.
ОВ100 надо создать в своей программе и загрузить в контроллер. К примеру, в него рекомендуют сконфигурировать ПИД-регулятор с командой сброса накопленных промежуточных данных в DB. Контроллер вызывает ОВ100 сам, ничего нигде указывать не нужно.
Переинициализация FB, DB в программе пользователя - задача инженера-программиста.
С оф. сайта скачайте данные по процессорным модулям. Там все - и концепция памяти, и виды пусков описаны. Про все сразу, рассказать затруднительно :)

dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?] Програмная инициализация DB.

Post by dmitry_79 » Sat Feb 19, 2011 7:49 am

Значит програмным способом (в программе пользователя) вызвать ОВ102 (холодный рестарт) нельзя? Я правильно понял? Если так - то жаль...

Рассматриваю другой вариант: системная функция SFC21 - nitializing a Memory Area with SFC 21 "FILL"

Если я сделаю такой вызов:

Code: Select all

CALL  SFC   21
       BVAL   :=0
       RET_VAL:=#ret_value
       BLK    :=DB100
Произойдет ли заполнение DB100 нолями? Нужно-ли указывать как-то где-то длинну DB, или данная функция будет обрабатывать весь блок до конца?

На момент написания сообщения нет возможности проверить работоспособность этого кода, поэтому прорабатываю вопрос теоретически.

Yury
Posts: 65
Joined: Thu Nov 01, 2007 9:41 pm
Location: Belarus

Re: [?] Програмная инициализация DB.

Post by Yury » Sat Feb 19, 2011 2:16 pm

Code: Select all

CALL  "FILL"
       BVAL   :=MB10
       RET_VAL:=#ret_value
       BLK    :=P#DB100.DBX10.0 BYTE 10

dmitry_79
Posts: 149
Joined: Sun Dec 20, 2009 1:30 pm
Location: Russia

Re: [?] Програмная инициализация DB.

Post by dmitry_79 » Sun Feb 20, 2011 6:36 am

Yury wrote:

Code: Select all

CALL  "FILL"
       BVAL   :=MB10
       RET_VAL:=#ret_value
       BLK    :=P#DB100.DBX10.0 BYTE 10
Указатель P# в последней строке означает, что 0 (примем: МВ10 содержит 0) заполнятся 10 байт блока DB100 начиная с адреса DBX10.0 ?
Прошу прощения если вопрос ламерский - не очень дружу с косвенной адресацией в LAD...

Получается, что для полного заполнения нолями блоков разной длины надо вызывать функцию отдельно для каждого блока и в параметрах указывать количество заполняемых байт - то есть длину DB?

Yury
Posts: 65
Joined: Thu Nov 01, 2007 9:41 pm
Location: Belarus

Re: [?] Програмная инициализация DB.

Post by Yury » Mon Feb 21, 2011 9:27 pm

Да, именно так...
Если Вам нужно на определённом шаге программы произвести возврат к отличным от нуля initial value, можно создать блок (блоки) данных предназначенный именно для хранения переменных (данные в котором не будут меняться в процессе выполнения программы), и в необходимый момент копировать при помощи SFC 20 данные из резервного DB, в DB учавствующий в выполнении программы.

CHANt
Posts: 501
Joined: Tue Jun 27, 2006 5:52 am
Location: Russia

Re: [?] Програмная инициализация DB.

Post by CHANt » Tue Feb 22, 2011 4:12 pm

Еще, обратите внимание на временную переменную OB1_SCAN_1 в ОВ1. Она имеет ряд значений которые можно использовать при инициализации:
B#16#01: завершение теплого рестарта
B#16#02: завершение горячего рестарта
B#16#03: завершение основного цикла
B#16#04: завершение холодного рестарта
Т.е. Вы можете вполне точно задать условия - какие данные нужны в той или иной DB при старте ОВ1, в зависимости от того какой вид рестарта был выполнен.

Post Reply