- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
SD карта для S7-1200
-
- здесь недавно
- Сообщения: 2
- Зарегистрирован: 10 апр 2018, 14:03
- Имя: Игорь
SD карта для S7-1200
Очень интересует вопрос: можно ли увеличить энергонезависимую память DB блоков с помощью SD карты. Без неё у контроллера, например S7-1217c, выделено всего 10кБайт. А надо вести архив полугодичный объёмом 30кБайт?
-
- почётный участник форума
- Сообщения: 3576
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
SD карта для S7-1200
10 кБайт у всех ЦПУ и никак не увеличить. На SD-карту вроде можно выгружать рецепты и логи, но это процедура не на уровне "поставить галочку retain, использовать ячейку для хранения как обычный бит или байт", это делается через процедуру выгрузки файла и т.п.
-
- здесь недавно
- Сообщения: 2
- Зарегистрирован: 10 апр 2018, 14:03
- Имя: Игорь
SD карта для S7-1200
спасибо за подсказку - нашёл в расширенных инструкциях команду DataLogCreate. В хелпе про неё сказано, что лог создаётся на Sd карте или во внутренней памяти в соответствующем каталоге. Из хелпа следует, что по умолчанию лог создаётся на SD карте, если она есть?
-
- почётный участник форума
- Сообщения: 3576
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
SD карта для S7-1200
Карта памяти расширяет встроенную flash-память и (я так думаю) считается её неразрывной частью. Или таки заменяет её, как считаете вы?
-
- освоился
- Сообщения: 281
- Зарегистрирован: 14 фев 2014, 11:55
- Имя: Николай
- Страна: Россия
- Благодарил (а): 9 раз
- Поблагодарили: 64 раза
SD карта для S7-1200
Ничего не надо увеличивать. Там и так встроенная флешка на несколько мегабайт (не помню сколько у 1217C, помню, что 1215C - 4 Мб). Архив нужно вести в обычный DB без Retain. При выключении питания значения надо скидывать на флешку функцией WRIT_DBL.Igoro-fil6567 писал(а): ↑10 апр 2018, 14:18 Очень интересует вопрос: можно ли увеличить энергонезависимую память DB блоков с помощью SD карты. Без неё у контроллера, например S7-1217c, выделено всего 10кБайт. А надо вести архив полугодичный объёмом 30кБайт?
-
- новенький
- Сообщения: 1
- Зарегистрирован: 04 фев 2019, 10:23
- Имя: Виталий
- Страна: Россия
- Благодарил (а): 1 раз
SD карта для S7-1200
Nicolayy, день добрый. Вы имеете ввиду при ручном выключении питания предварительно "ручками" запускать функцию копирования DB в Load memory? Или есть какой-то программный триггер, который запускается при отключении питания CPU?
-
- освоился
- Сообщения: 281
- Зарегистрирован: 14 фев 2014, 11:55
- Имя: Николай
- Страна: Россия
- Благодарил (а): 9 раз
- Поблагодарили: 64 раза
SD карта для S7-1200
Vitaliy_A, честно говоря, я такого триггера не знаю. Я использовал на одном из объектов флешку для сохранения больших групп параметров (т.н. рецептов), а они сохранялись по нажатии соответствующей кнопки на панели после того как таблица рецепта заполнена оператором. Касательно Вашей задачи, я не вижу проблемы, чтобы просто завести напрямую с блока питания на дискретный вход контроллера сигнал, по которому и отслеживать предстоящее выключение ПЛК.
Еще могу добавить, что там есть две функции - WRIT_DBL и READ_DBL (соответственно, запись на флешку и чтение с нее). Так вот, с WRIT_DBL вообще никаких проблем не было, а вот READ_DBL у меня работала очень косячно, т.е. при тестировании на небольших объемах данных всё работало хорошо, но при чтении больших массивов происходили какие-то необъяснимые глюки - то, условно, из 100 чисел 99 считывало нормально, а какое-нибудь одно - не считывало, ну что-то типа того. Причем, всё достаточно хаотично было (иногда вообще всё нормально считывалось, перезагружаешь ПЛК - с ошибками считывается, еще раз перезагружаешь - опять всё нормально). Я сначала и не знал, что конкретно не так работает (думал, может это WRIT_DBL неправильно сохраняет что-то). Короче говоря, потом выяснилось, что функцию READ_DBL вообще не надо использовать, там как-то автоматически (к сожалению, я уже не помню как именно) при включении ПЛК с флешки всё копируется в нужный DB, т.е. нужно только сохранять данные через WRIT_DBL и всё.
Еще могу добавить, что там есть две функции - WRIT_DBL и READ_DBL (соответственно, запись на флешку и чтение с нее). Так вот, с WRIT_DBL вообще никаких проблем не было, а вот READ_DBL у меня работала очень косячно, т.е. при тестировании на небольших объемах данных всё работало хорошо, но при чтении больших массивов происходили какие-то необъяснимые глюки - то, условно, из 100 чисел 99 считывало нормально, а какое-нибудь одно - не считывало, ну что-то типа того. Причем, всё достаточно хаотично было (иногда вообще всё нормально считывалось, перезагружаешь ПЛК - с ошибками считывается, еще раз перезагружаешь - опять всё нормально). Я сначала и не знал, что конкретно не так работает (думал, может это WRIT_DBL неправильно сохраняет что-то). Короче говоря, потом выяснилось, что функцию READ_DBL вообще не надо использовать, там как-то автоматически (к сожалению, я уже не помню как именно) при включении ПЛК с флешки всё копируется в нужный DB, т.е. нужно только сохранять данные через WRIT_DBL и всё.
-
- освоился
- Сообщения: 281
- Зарегистрирован: 14 фев 2014, 11:55
- Имя: Николай
- Страна: Россия
- Благодарил (а): 9 раз
- Поблагодарили: 64 раза
SD карта для S7-1200
Ну, в общем, если кому-то понадобиться сохранять что-то на флешку.
Чтобы сохранить значения дата-блока в память, а потом чтобы значения автоматически загрузились при включении PLC, не нужно вообще использовать функцию READ_DBL. Значит так: создаете Data Block, в нём обязательно НЕ должна стоять галочка "Only store in load memory". Значения хранятся без Retain. В общем, в каждом цикле вызываете функцию WRIT_DBL, где в качестве SOURCE и DESTINATION указываете ОДИН И ТОТ АДРЕС в этом DB, например,
if(#is_Busy) then #is_Save := false; end_if;
#Code := WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value1, SRCBLK := "Temp_DB".Value1, BUSY => #is_Busy);
#is_Save := false;
Бит запроса (REQ) нужно устанавливать только один раз, потом уже надо просто вызывать функцию с REQ = false, поэтому бит is_Save сразу надо обнулять.
В переменную #code возвращается код "ошибки" судя по инструкции, но на самом деле не только ошибки там возвращаются, т.е. при первом цикле с REQ = true будет возвращаться значение 16#7001 (First call with REQ = 1: Data transfer triggered; BUSY has the value "1"), при последующих циклах будет возвр. 7002 (Intermediate call (REQ irrelevant): Data transfer already active; BUSY has the value "1"), а после завершения записи на флешку - 7001 (First call with REQ = 0: No data transfer active; BUSY has the value "0").
И всё. На первом цикле PLC сохраненные значения будут автоматически загружаться, READ_DBL вызывать не надо.
Ну, и еще нужно помнить, что функцию можно вызывать несколько раз одновременно, т.е.
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value1, SRCBLK := "Temp_DB".Value1, BUSY => "is_Busy");
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value2, SRCBLK := "Temp_DB".Value2, BUSY => "is_Busy");
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value3, SRCBLK := "Temp_DB".Value3, BUSY => "is_Busy");
"is_Save" := false;
Но если сделать сразу слишком много вызовов (раз 100, наверное), то может возникнуть ошибка 16#80C3. Честно говоря, я не заметил, чтобы эта ошибка как-то влияла на успешность сохранения, т.е. всё вроде бы и даже с ней нормально сохранятся, но лучше, наверно, всё-таки стараться так делать, чтобы такой ситуации не возникало. Еще странно, что в инструкции написано для 80C3 - Note: This error code is only for S7-1500 CPUs, почему так написано, не очень понятно, потому что на S7-1200 она также вылазит.
И еще можно сразу весь Data Block отправлять на сохранение, а не отдельные переменные:
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB", SRCBLK := "Temp_DB", BUSY => "is_Busy");
Теперь касательно того, что нужно что-то сохранить не по нажатию какой-то кнопки или по событию, а при отключении электропитания. Тут есть такой нюанс, что времени на сохранение может и не хватить. Например, у меня 6 секунд вот сохраняются значения, хотя их там достаточно много (DB на 60 кб), для такого случая нужно что-то мутить с ИБП, например, конденсаторного типа, который позволит сохранять контроллер во включенном состоянии секунд 20 после пропадания питания.
Чтобы сохранить значения дата-блока в память, а потом чтобы значения автоматически загрузились при включении PLC, не нужно вообще использовать функцию READ_DBL. Значит так: создаете Data Block, в нём обязательно НЕ должна стоять галочка "Only store in load memory". Значения хранятся без Retain. В общем, в каждом цикле вызываете функцию WRIT_DBL, где в качестве SOURCE и DESTINATION указываете ОДИН И ТОТ АДРЕС в этом DB, например,
if(#is_Busy) then #is_Save := false; end_if;
#Code := WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value1, SRCBLK := "Temp_DB".Value1, BUSY => #is_Busy);
#is_Save := false;
Бит запроса (REQ) нужно устанавливать только один раз, потом уже надо просто вызывать функцию с REQ = false, поэтому бит is_Save сразу надо обнулять.
В переменную #code возвращается код "ошибки" судя по инструкции, но на самом деле не только ошибки там возвращаются, т.е. при первом цикле с REQ = true будет возвращаться значение 16#7001 (First call with REQ = 1: Data transfer triggered; BUSY has the value "1"), при последующих циклах будет возвр. 7002 (Intermediate call (REQ irrelevant): Data transfer already active; BUSY has the value "1"), а после завершения записи на флешку - 7001 (First call with REQ = 0: No data transfer active; BUSY has the value "0").
И всё. На первом цикле PLC сохраненные значения будут автоматически загружаться, READ_DBL вызывать не надо.
Ну, и еще нужно помнить, что функцию можно вызывать несколько раз одновременно, т.е.
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value1, SRCBLK := "Temp_DB".Value1, BUSY => "is_Busy");
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value2, SRCBLK := "Temp_DB".Value2, BUSY => "is_Busy");
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB".Value3, SRCBLK := "Temp_DB".Value3, BUSY => "is_Busy");
"is_Save" := false;
Но если сделать сразу слишком много вызовов (раз 100, наверное), то может возникнуть ошибка 16#80C3. Честно говоря, я не заметил, чтобы эта ошибка как-то влияла на успешность сохранения, т.е. всё вроде бы и даже с ней нормально сохранятся, но лучше, наверно, всё-таки стараться так делать, чтобы такой ситуации не возникало. Еще странно, что в инструкции написано для 80C3 - Note: This error code is only for S7-1500 CPUs, почему так написано, не очень понятно, потому что на S7-1200 она также вылазит.
И еще можно сразу весь Data Block отправлять на сохранение, а не отдельные переменные:
#Code :=WRIT_DBL(REQ := #is_Save, SRCBLK := "Temp_DB", SRCBLK := "Temp_DB", BUSY => "is_Busy");
Теперь касательно того, что нужно что-то сохранить не по нажатию какой-то кнопки или по событию, а при отключении электропитания. Тут есть такой нюанс, что времени на сохранение может и не хватить. Например, у меня 6 секунд вот сохраняются значения, хотя их там достаточно много (DB на 60 кб), для такого случая нужно что-то мутить с ИБП, например, конденсаторного типа, который позволит сохранять контроллер во включенном состоянии секунд 20 после пропадания питания.