OberonCore https://forum.oberoncore.ru/ |
|
ОИК "Восход" https://forum.oberoncore.ru/viewtopic.php?f=5&t=5677 |
Страница 2 из 10 |
Автор: | Илья Ермаков [ Вторник, 26 Апрель, 2016 02:06 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
В проекте LPC2103, там, не помню, 16 бит, кажется, размер буфера. Используемая скорость Modbus - 40-с-чем-то КБод. В принципе, учитывая производительность LPC-шки, даже без умножителя частоты, переполнения быть не должно. Разумеется, не абсолютизирую режим "без прерываний" - но никто не мешает ввести обработку прерываний отдельно от основной логики, пусть по прерыванию забирается в более крупный буфер, а основная логика пишется в стиле неблокирующем. Это позволило хорошо и надежно описать основную логику. Разрабатывалось несложное, но с запутанными режимами устройство - выносной пульт управления контроллером перекрёстка (программатор для перекрёстка, по сути). И там сочетание конечноавтоматности с неблокирующей логикой и абстракциями типа классом контроля нажатий-отпусканий, классом, абстрагирующим целиком органы управления и т.п. помогло получить надёжный код и почти не отлаживаться. Кстати, поскольку с дин. памятью работы нет, то С++ оказался терпим. И однозначно рулил в сравнении с простым С, ибо хоть защита и абстракция какая-никакая ) |
Автор: | prospero78 [ Вторник, 26 Апрель, 2016 08:29 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Alexander Shiryaev писал(а): Илья Ермаков писал(а): ...без прерываний... А как часто происходит вызов Channel_Uart0::Task_Body / Channel_U1_485::Task_Body? Буфера FIFO приёмника порта UART хватает? Илья тут уже подробненько ответил, от себя добавлю, что Модбас запрос байт5-6, Модбас ответ столько же. Работает по схеме "запрос-ответ" (пассивный протокол, потом прикрутили и активную фазу, но не взлетело). Поэтому буфер на 16 байт целиком перекроет потребность в буфере приёма. Я практически не встречал в полевых устройствах скорости выше 18 кБит (практически везде 2,4-9,6 кБит, и одно устройство на линии [хотя видел реальные решения на 4-8 устройств, но там скорость была не важна -- автомобильные и железнодорожные весы]). При пакете в 4 байта необходимо опрашивать буфер приёма примерно 600 раз в секунду. Вполне выполнимое условие. А если буфер приёма 16 байт, то всего 150 раз. При тактовой частоте процессора 7 МГц: 1. Вызвать подпрограмму -- 11 тактов. 2. Считать байт из порта ввода -- 7 тактов. 3. Закинуть в память -- 4 такта. ([2, 3] повторяем ещё три раза -- 33 такта) 4. Возврат назад 11 тактов. Итого: 66 тактов. При 600 опросах в секунду: 39600 тактов из 7 млн. -- 0,6% от общей вычислительной мощности. При 150 опросах и 16 байтах буфера опрос займёт 198 тактов. 29700 тактов в секунду. Из 7 млн. примерно 0,4% Как видно, разница всего в 1,5 раза, и служебные расходы на опрос в любом случае смешные) На обработку данных средствами полевого устройства остаётся 99% времени. Да я за 6,9 млн тактов ещё успею Эйнштейн@Хоум посчитать))) А если опрос асинхронный, тупая молотилка по кругу, то в буфере 146% по жизни ничего не будет. |
Автор: | prospero78 [ Пятница, 29 Апрель, 2016 09:06 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Коллеги подскажите профану. При показе окна через OpenAuxTool предварительно выставляю флаг bShow. Он нужен для того, что бы обновлять только те данные, которые отображаются через окно. Оператор может закрыть окно в любой момент, а флаг bShow остаётся поднятым. Я подозреваю, что у окна есть собственные средства контроля видимости )))) Ткните пальцем где копать, плиз. |
Автор: | Илья Ермаков [ Пятница, 29 Апрель, 2016 11:22 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Не совсем понятен вопрос. |
Автор: | prospero78 [ Пятница, 29 Апрель, 2016 13:46 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Илья Ермаков писал(а): Не совсем понятен вопрос. Оператор может закрыть окно в любой момент, за ненадобностью. Признак "отображённости окна" остаётся. И программа пытается обновлять данные на экране, которого уже нет. Можно, конечно, вообще отвязать этот модуль для формы через DoLater, из которого ББ берёт экспортированные данные.... Надо тут додумать. |
Автор: | Илья Ермаков [ Пятница, 29 Апрель, 2016 13:51 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Косвенный признак присутствия окна на экране - это вызов Guard-ов. Т.е., по идее, из какого-то Guard-а окна можно обновлять переменную времени: lastWindowOpened := Services.Ticks(). А на обновление: IF Services.Ticks() < lastWindowOpened + openedInterval THEN... |
Автор: | prospero78 [ Пятница, 29 Апрель, 2016 14:20 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Ага. Т. е. если объявить глобальную переменную в другом модуле, и засечь, что она не обновляется, значит Guard не срабатывает? Хм, Илья.... ))) Оригинально! Хотя... Переменную можно объявить в том же модуле (для отображения формой). |
Автор: | Илья Ермаков [ Пятница, 29 Апрель, 2016 14:21 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Только Guard также может не вызываться по причине скрытости всего ББ, и т.п. Т.е. нужна вторая ветка логики: - как только вдруг Guard вызвался первый раз после долгого простоя, форсировать Update для всех данных. |
Автор: | prospero78 [ Пятница, 29 Апрель, 2016 14:32 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Илья Ермаков писал(а): Т.е. нужна вторая ветка логики: - как только вдруг Guard вызвался первый раз после долгого простоя, форсировать Update для всех данных. Ну, я так и понял. Guard сработал -> метка времени обновилась -> планировщик проверил, что всё в ажуре, форма видна -> Dialog.Update или вариант два (чуть более грамотный): всё-таки DoLater встроить в сам модуль для отображения формы: проверил метку времени, если отличается больше, чем на delta_t, значит не обновляем форму. Второй частью DoLater проверяет флаг bEndProg из modGlob, и если поднят, тогда все переменные модуля в NIL и прервали цикл (я правильно понимаю, что сборщик мусора выгрузит модуль сам?) Сработал Guard -- Dialog.Update(NOW). Связность тут будет ниже. |
Автор: | Info21 [ Суббота, 30 Апрель, 2016 18:19 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Сообщения рассылаются по видимым вьюшкам. Научите свою вьюшку реагировать на специальное сообщение. Среагировала -- значит, видна. Как-то так. |
Автор: | Илья Ермаков [ Суббота, 30 Апрель, 2016 18:30 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Да, но если у человека не вьюшка, а тупо форма ) |
Автор: | Info21 [ Воскресенье, 01 Май, 2016 13:40 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Илья Ермаков писал(а): Да, но если у человека не вьюшка, а тупо форма ) Надо, наверное, форме сделать обёртку. |
Автор: | Илья Ермаков [ Вторник, 03 Май, 2016 03:00 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Ну, не факт, что захочется делать новый тип вьюхи... Хотя, видимо, да, это будет гарантировано. Именно обёртка вокруг - чтоб не было ситуации, что часть окна не видна - и всё, типа, не видно целиком... А в случае в гвардом, наверное, так и будет. |
Автор: | Info21 [ Среда, 04 Май, 2016 20:23 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Илья Ермаков писал(а): Ну, не факт, что захочется делать новый тип вьюхи... Хотя, видимо, да, это будет гарантировано. Надо один раз насобачиться -- и лепить эти обёртки как пельмени. Удобная штука. |
Автор: | prospero78 [ Пятница, 06 Май, 2016 14:35 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Не знаю куда запихнуть, пихаю тут -- нашёл косяк. В System/Docu/Math (версия ББ 1.6, Красноярская сборка) в документации по описанию гиперболических и тригонометрических функций приведена формула "(1 рад = 180/pi градусов)", что имхо, слегка неправда. 1 рад = pi/180 градусов < вот так результат верный. Формулку из документации не думая переписал в код ОИК "Восход" и десятка два минут тупо смотрел на монитор, не понимая, что происходит. |
Автор: | albobin [ Пятница, 06 Май, 2016 15:09 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Думаю, что Вам решительно возразят |
Автор: | prospero78 [ Пятница, 06 Май, 2016 15:14 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Эээ... Если делить пи на градусы, то получим соотношение 1 радиана на какое-то количество градусов. Если 180 градусов на пи -- то какое-то количество градусов на каждый радиан. У меня исходные данные в градусах, которые нужно привести к радианам. Если я напишу 180/pi*grad = [хрен поймёшь чему равно]? |
Автор: | Kemet [ Пятница, 06 Май, 2016 15:16 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
prospero78 писал(а): (1 рад = 180/pi градусов)", что имхо, слегка неправда. 1 рад = pi/180 градусов < вот так результат верный. Новая Система Ебиниц от prospero78?
|
Автор: | Александр Ильин [ Пятница, 06 Май, 2016 15:20 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
1 радиан = 57.2958 градусов. Но я признаю ваше право на иное мнение. |
Автор: | prospero78 [ Пятница, 06 Май, 2016 15:34 ] |
Заголовок сообщения: | Re: ОИК "Восход" |
Сколько градусов в радиане, я в курсе))) И это сомнению не подлежит (по крайней мере, при существующих физических константах в нашем пространстве-времени). Я не понимаю, почему делаю 180/pi*grad -- получается ерунда. Когда делаю pi/180*grad = правильный ответ. Размерности, будут правильные при [рад/град]*град. На выходе чистые радианы. И это правильно! Размерность [град/рад]*град будет [град^2/рад]. Это равно радиану??? Получается, что документация содержит ошибку в приводимой формуле? Код: Тригонометрические и гиперболические функции Аргументы всех тригонометрических и гиперболических функций должны задаваться в радианах, и обратные тригонометрические и гиперболические функции расчитываются в радианах (1 рад = 180/pi градусов). В конце этой секции приведена таблица преобразований для расширенных тригонометрических и гиперболических функций, которые не вошли в модуль Math, поскольку могут быть легко записаны в терминах основных функций. Я же не придумал это? Kemet писал(а): prospero78 писал(а): (1 рад = 180/pi градусов)", что имхо, слегка неправда. 1 рад = pi/180 градусов < вот так результат верный. Новая Система Ебиниц от prospero78?Кемет, как всегда очень остроумно). Обхохочешься. И какой полёт инженерно-технической мысли! Ажна до пояса достаёт! |
Страница 2 из 10 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |