SIEMENS, DF&PD

Предыдущее посещение: Сб июл 02, 2016 4:19 Текущее время: Сб июл 02, 2016 4:19

Часовой пояс: UTC + 3 часа




 [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Отработка глобальных скриптов...
СообщениеДобавлено: Чт июн 09, 2011 10:35 
Не в сети
Известный Писатель

Зарегистрирован: Чт мар 17, 2005 15:18
Сообщения: 103
Откуда: РУП ПО "Беларуськалий"
Имеем:
функцию проекта, где объявляется массив. Функция привязана на открытие основной картинки – для инициализации массива. Массив (как extern) используется в GMSGFUNC.FCT, которая отрабатывает при возникновении ( сбросе или квитировании) аварии и в глобальных скриптах, которые запускаются после отработки в GMSGFUNC.FCT и в которых используются функции проговора аварийных сообщений.
Все прекрасно работало в проектах WinCC версий 5, 6 и 7 SP1 HF4. Проект загружается в RunTime, открывается главная картинка и начинают проговариваться аварийные (если они есть).
На днях мигрировали еще один проект из версии 5 в версию 7 SP1 HF4. На РС поставили ХР SP3 Professional английская. Проект загружается в RunTime, но еще до открытия графики начинает отрабатывать GMSGFUNC.FCT, звучат голосовые. В итоге имеем ошибки по скриптам, проект неработоспособный. Получается, что в GMSGFUNC.FCT и аварийных скриптах используется массив, который еще не объявлен.
Почему так происходит? Нормальна ли такая преждевременная отработка скриптов? Хотелось бы понять причину, чтобы знать, с чем бороться. Может кто-то уже сталкивался с подобным проявлением?
Повторюсь, что так только с одним проектом на одной станции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 09, 2011 13:23 
Не в сети
Известный Писатель

Зарегистрирован: Ср фев 16, 2011 14:23
Сообщения: 434
Откуда: Санкт-Петербург, Москва
Если я вас правильно понял, проблема в том что действие выполняется раньше чем инициализируется массив (т.е. при загрузке), чего не должно быть? Если так, то пробовали ли ввести дополнительную глобальную переменную (или тэг) "инициализация завершена" и выставлять ее в TRUE после инициализации массива?

А в действии, где есть обращение к нему, добавить проверку что флаг выставлен и только тогда работать с массивом.

Кстати, по какому триггеру срабатывает действие?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 09, 2011 13:39 
Не в сети
Известный Писатель

Зарегистрирован: Ср фев 16, 2011 14:23
Сообщения: 434
Откуда: Санкт-Петербург, Москва
Кстати, экспериментальным путем пришел к следующему (походу то ли реализация в WinCC чуть отличается от стандарта Ansi C, то ли я что-то неправильно понимаю, может быть кто-то объяснит все тонкости?):

1. Создаю отдельную глобальную функцию только для объявления глобальных переменных и их инициализации.

2. Объявляю эти переменные в FCT-файле вне тела функции БЕЗ слова static. Самое интересное, что если их объявить как static, то начинаются неожиданные вещи. Это очень странно, ведь по стандартам Ansi C это одно и то же (объявление переменной вне функции без указания класса хранения считается объявлением ее как static).

3. Если не достаточно инициализации переменных константами, остальное делаю в самом теле функции. А функцию вызываю по событию открытия главной PDL.

Остальные варианты почему-то давали непредвиденные результаты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 09, 2011 14:51 
Не в сети
Известный Писатель

Зарегистрирован: Чт мар 17, 2005 15:18
Сообщения: 103
Откуда: РУП ПО "Беларуськалий"
Alexey_Spb_82, Вы правильно поняли проблему. Только сейчас меня больше интересует не как ее обойти, а почему она возникла. Правильно ли для WinCC v7, что скрипты начинают отрабатывать до полного старта проекта? Почему так не было раньше ни с одной версией WinCC ?

Цитата:
Кстати, по какому триггеру срабатывает действие?

При возникновении аварии (в нашем случае - наличие аварии при старте проекта) запускается системная ф-ция GMSGFUNC.FCT, в ней взводится внутренняя переменная, по которой отрабатывает глобальный скрипт с PlaySound(). В самой ф-ции GMSGFUNC.FCT тоже отрабатывает PlaySound() для определенного класса сообщений.

Что касается статических переменных, то приведу цитату:
"Переменная Си становится действительна только после ее описания. Она становится недействительной после завершения исполнения функции. При последующем вызове этой же функции переменная создается вновь. Тем не менее, ключевое слово static, предваряющее имя переменной, позволяет предотвратить уничтожение переменной
после завершения функции. Таким образом, эта переменная сохранит свое значение до последующего вызова функции. Однако, в случае процедур Си, это имеет место только до тех пор, пока отображается текущая экранная форма WinCC. Статические переменные становятся недействительны, как только экранная форма перестает отображаться. При очередном открытии экранной формы статические переменные будут созданы вновь во время первого исполнения процедуры Си."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 09, 2011 15:34 
Не в сети
Известный Писатель

Зарегистрирован: Ср фев 16, 2011 14:23
Сообщения: 434
Откуда: Санкт-Петербург, Москва
Вера, я полагаю что это связано с тем, что при запуске срабатывает триггер на изменение переменной и вызывает то самое действие. возможно, это связано с загрузкой начального значения в тэг или с его инициализацией.

Я наблюдал что-то подобное - действия, висящие на изменении внутренних тэгов, срабатывали при старте проекта, хотя сами тэги не менялись. Избавился от этого добавлением того самого флага.

А насчет того что пишет Сименс - имхо, это подтверждает то, что C в winCC все же немного отличается от стандарта Ansi С.

В этой цитате они говорят об автоматическом выделении памяти для переменных с классом хранения auto (в т.ч. объявленных внутри функций без указания класса хранения).

Большое спасибо за приведенную цитату, теперь ясна природа многих 'странностей' с глобальными переменными.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group