Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Архив
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

проблема функционирования программ для ко

 Ответить Ответить Страница  12>
Автор
Сообщение
nick_user Смотреть выпадающим
Участник
Участник


Присоединился: 18 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - nick_user Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: проблема функционирования программ для ко
    Опубликовано: 18 Ноябрь 2005 15:45
В некоторых проектах, которые мы делали на контроллерах I-7188 (как правило, 256 кБ RAM, 512 кБ FLASH), мы столкнулись с ненадежным (даже сбойным!) функционированием программ, написанных под эти контроллеры в среде разработки TC++ 3.0(3.1). Причину проблемы до сих пор выявить не удалось, однако её суть вот в чем:
При определенных условиях (каких – неизвестно) возникает сбой в работе непрерывно работающей программы, записанной в контроллере, который проявляется в том, что значения переменных программы вдруг скачкообразно изменяются на произвольные.
Соответственно, это приводит, как минимум, к таким последствиям, как останов программы и всего оборудования, которым она управляет. Это в лучшем случае, т.е. когда программа написана с использованием метода переменных состояния (при этом система переходит в дефолтное
состояние, в котором все устройства выключаются).

Наши предположения о причине проблемы были совершенно разнообразные:
1. Наши исходные коды несовершенны и дают утечки памяти (память выделяется, но не освобождается).
Опровержение: один проект мы делали, вообще не используя динамическое выделение памяти.
2. Библиотеки для доступа к периферии контроллера дают утечки памяти.
Опровержение: нет.
Мы выяснили, что функции доступа к таймерам действительно дают утечки памяти, по каковой причине пришлось разработать свои и пользоваться ими. Насчет остальных функций – неизвестно.
3. Ненадежная защита цепей питания контроллера от помех.
Опровержение: нет.
Однако, мы выяснили, что в случае подключения длинного кабеля RS485 к оптонеизолированному порту COM1 контроллера появляются именно такие сбои программы (памяти), как описано выше (достаточно часто – раз в одну-две недели).

Таким образом, действительная причина таких нам до сих пор неизвестна.

Вопросы:
1. Какие требования к питанию данного контролера.
2. Какие требования к защите по COM портам.
3. В каких проектах и для каких задач использовались данные контролеры, с указанием примерных размеров программ.
4. Как отследить утечки памяти работающей программы?
5. Есть ли спецификация на ОС MiniOS7 (функции ОС
на каком программном прерывании реализованы и т.п.) и где
достать?

Спасибо за ответы.
Наверх
evgen Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Сентябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 178
Свойства публикации Свойства публикации   Ответить, цитируя автора - evgen Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Ноябрь 2005 17:52
Первоначально опубликовано nick_user

В
При определенных условиях (каких – неизвестно) возникает сбой в работе непрерывно работающей программы, записанной в контроллере, который проявляется в том, что значения переменных программы вдруг скачкообразно изменяются на произвольные.

Прям как бальзам на раны. Оказывается, не у меня одного такая или аналогичная хрень происходит...
SY,
EK
Наверх
EvchSerg Смотреть выпадающим
Новичок
Новичок


Присоединился: 19 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 7
Свойства публикации Свойства публикации   Ответить, цитируя автора - EvchSerg Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Ноябрь 2005 23:49
Приветствую.
Я в последнее время бьюсь над потерей данных при передачи между контроллером I-7188 и компьютером.
Периодичность потери от 10 мин. до 10 часов.
Теряются от нескольких символов до нескольких строк.

Экспериментировал:
- c разными контроллерами - не зависит;
- с размими операционными системами - Разная реакция на операторы cout и printf;
- с разными операторами вывода в порт (нет чёткого понимания их функционирования);
- с разными компьютерами (оказывается есть зависимость);

Приведу кусок программы и результат работы. Может кто даст совет?

Пример программы
                     printCom4("%02d:%02d:%02d:%03d fo_r[%d]              %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fo_r[chout]);
                     printCom4("%02d:%02d:%02d:%03d fr_r[%d]              %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fr_r[chout]);
                     printCom4("%02d:%02d:%02d:%03d tm_r[%d]              %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, tm_r[chout]);
                     printCom4("%02d:%02d:%02d:%03d df_r[%d]              %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, df_r[chout]);
                     printCom4("%02d:%02d:%02d:%03d fo[%d]               %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fo[chout]);
                     printCom4("%02d:%02d:%02d:%03d fr[%d]               %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fr[chout]);
                     printCom4("%02d:%02d:%02d:%03d tm[%d]               %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, tm[chout]);
                     printCom4("%02d:%02d:%02d:%03d df[%d]               %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, df[chout]);
                     printCom4("%02d:%02d:%02d:%03d foi_f[%d]             %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, foi_f[chout]);
                     printCom4("%02d:%02d:%02d:%03d fri_f[%d]             %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, fri_f[chout]);
                     printCom4("%02d:%02d:%02d:%03d tmi_f[%d]             %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, tmi_f[chout]);
                     printCom4("%02d:%02d:%02d:%03d dfi_f[%d]             %.0f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, dfi_f[chout]);
                     printCom4("%02d:%02d:%02d:%03d Kvi[%d]               %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, Kv[chout]);
                     printCom4("%02d:%02d:%02d:%03d CountKv[%d]           %d\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, (int)CountKv[chout]);
                     printCom4("%02d:%02d:%02d:%03d Ckv[%d]               %.4f\r\n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund, (int)chout, Ckv[chout]);


Результат работы
22:36:42:054 fo_r[1]              1788077
22:36:42:054 fr_r[1]              1752816
22:36:42:054 tm_r[1]              23.9375
22:36:42:054 df_r[1]              35261
22:36:42:054 fo[          357615
22:36:42:054 fr[1]               350563
22:36:42:054 tm[1]               4.7875
22:36:42:054 df[1]               7052
22:36:42:054 foi_f[1]             35762
22:36:42:054 fri_f[1]             35056
22:36:42:054 tmi_f[1]             0.4787
22:36:42:054 dfi_f[1]             705
22:36:42:054 Kvi[1]               -1.0872
22:36:42:054 CountKv[1]           1
22:36:42:054 Ckv[1]               -3.2617
22:36:46:055 fo_r[2]              1764279
22:36:46:055 fr_r[2]              1728043
22:36:46:055 tm_r[2]              24.0000
22:36:46:055 df_r[2]              36236
22:36:46:055 fo[2]               352856
22:36:46:055 fr[2]               345609
22:36:46:055 tm[2]               4.8000
22:36:46:055 df[2]               7247
22:36:46:055 foi_f[2]             35286
22:36:46:055 fri_f[2]             34561
22:36:46:055 tmi_f[2]             0.4800
22:36:46:055 dfi_f[2]             725
22:36:46:055 Kvi[2]               -1.6586

Числа начинаются с 35 позиции.
При шрифте с равной шириной символов числа расположены в столбик.
Потерялись данные в 5 строке.

С уважением,
Инженер Евченко Сергей Евгеньевич.
Наверх
nick_user Смотреть выпадающим
Участник
Участник


Присоединился: 18 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - nick_user Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 21 Ноябрь 2005 11:42
Первоначально опубликовано EvchSerg


Результат работы
22:36:42:054 fo_r[1]              1788077
22:36:42:054 fr_r[1]              1752816
22:36:42:054 tm_r[1]              23.9375
22:36:42:054 df_r[1]              35261
22:36:42:054 fo[          357615
22:36:42:054 fr[1]               350563
22:36:42:054 tm[1]               4.7875
22:36:42:054 df[1]               7052
22:36:42:054 foi_f[1]             35762
22:36:42:054 fri_f[1]             35056
22:36:42:054 tmi_f[1]             0.4787
22:36:42:054 dfi_f[1]             705
22:36:42:054 Kvi[1]               -1.0872
22:36:42:054 CountKv[1]           1
22:36:42:054 Ckv[1]               -3.2617
22:36:46:055 fo_r[2]              1764279
22:36:46:055 fr_r[2]              1728043
22:36:46:055 tm_r[2]              24.0000
22:36:46:055 df_r[2]              36236
22:36:46:055 fo[2]               352856
22:36:46:055 fr[2]               345609
22:36:46:055 tm[2]               4.8000
22:36:46:055 df[2]               7247
22:36:46:055 foi_f[2]             35286
22:36:46:055 fri_f[2]             34561
22:36:46:055 tmi_f[2]             0.4800
22:36:46:055 dfi_f[2]             725
22:36:46:055 Kvi[2]               -1.6586

Числа начинаются с 35 позиции.
При шрифте с равной шириной символов числа расположены в столбик.
Потерялись данные в 5 строке.



Уточните, пожалуйста, куда производится вывод этих данных - не в консоль 7188.exe ? Если так, то под WinXP у меня
половина данных теряется. Под Win2k вроде все нормально.
Это также зависит от того, связь между контроллером и компьютером по RS232 или по RS485.
Наверх
EvchSerg Смотреть выпадающим
Новичок
Новичок


Присоединился: 19 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 7
Свойства публикации Свойства публикации   Ответить, цитируя автора - EvchSerg Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 21 Ноябрь 2005 21:18
Да в консоль. Приём вёлся гипертерминалом под XP - теряется 0.1% - 1 раз в час.
При приёме гиппертерминалом по 98 - терялось до 5% - каждую мин.

Но причём тут может быть операционная система. Она обязана работать правильно. Думаю глюки в программе контроллера I-7188.
Интересно может оказывать влияние версия компилятора? Использую BC 3.1
С уважением,
Инженер Евченко Сергей Евгеньевич.
Наверх
nick_user Смотреть выпадающим
Участник
Участник


Присоединился: 18 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - nick_user Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 22 Ноябрь 2005 12:37
Операционная система работает правильно. Ваш контроллер - думаю тоже. Дело в программе 7188.exe и гипертерминале (на
мой взгляд).
Вы пробовали написать собственную программу, которая бы занималась аналогичным приемом данных (для проверки)? Могу выслать исходники на C++ (WinAPI) для работы с COM-портом. Мы часто их применяем в своих проектах.
Наверх
nick_user Смотреть выпадающим
Участник
Участник


Присоединился: 18 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - nick_user Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 22 Ноябрь 2005 12:47
Вдогонку:
Вы пробовали смотреть данные, поступающие в порт, какой-нибудь программой мониторинга COM-порта (например,
LGComSpy++ здесь)?

Думаю, он вам поможет увидеть, что пропадает.
Запускаете LGComSpy, выбираете нужный порт, запускаете
гипертерминал. И смотрите, что он принимает.
Просто у гипертерминала, по-моему, полно глюков при выводе
принятой информации на экран.
Наверх
remint Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Февраль 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 185
Свойства публикации Свойства публикации   Ответить, цитируя автора - remint Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 22 Ноябрь 2005 15:12
Первоначально опубликовано EvchSerg

Я в последнее время бьюсь над потерей данных при передачи между контроллером I-7188 и компьютером. Периодичность потери от 10 мин. до 10 часов.
Теряются от нескольких символов до нескольких строк.

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

Тут сам вопрос нужно ставить по другому - нужно реализовать нормальный протокол обмена, в простейшем случае типа Модбас - запрос-ответ с контрольной суммой в пакетах.
Александр Бурмистров,
www.entels.ru
Наверх
remint Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Февраль 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 185
Свойства публикации Свойства публикации   Ответить, цитируя автора - remint Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 22 Ноябрь 2005 15:23
Первоначально опубликовано nick_user

4. Как отследить утечки памяти работающей программы?

coreleft - Возвращает размер свободной оперативной памяти

       Назначение        Возвращает размер свободной оперативной памяти.

       Замечания        Функция coreleft возвращает размер свободной
                         оперативной памяти. Она дает различные значения
                         в зависимости от используемой модели памяти.

       Возвращаемое      В малых   моделях памяти coreleft возвращает
       значение          объем свободной памяти между вершиной кучи и
                         стеком, а в больших - объем памяти между самым
                         верхним выделенным блоком и концом доступной
                         памяти.

-----------------------------------------------------------------

farcoreleft - Возвpащает размер свободной памяти в куче с
                         дальней адpесацией
   
Александр Бурмистров,
www.entels.ru
Наверх
nick_user Смотреть выпадающим
Участник
Участник


Присоединился: 18 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - nick_user Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 22 Ноябрь 2005 16:04
Спасибо. Попробую все-таки отследить, что же там
происходит с программой.
Наверх
 Ответить Ответить Страница  12>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz