Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
Значит программа должна работать так:
1. Загружаем данные из файла и анализируем на наличие ошибок
2. Данные помещаем в переменные (точнее в динамический список) и запускаем один общий таймер, по которому будет вызыватся процедура каждую секунду.
3. При каждом вызове таймера, просматриваем все данные в динамическом списке и проверяем не пришло ли время передать данные устройству если пришло, то передаём и удаляем данные о выдержке из динамического списка.
Таким образом можно получить "паралельный" отсчёт всех задержек используя только один таймер. При этом зарание количество формируемых задержек неизвестно.
Цитата:
вот скрин буржуйской программы меня интересуют таймеры в левой чати картинки. ак добится нечто похожего это
Похоже что там использованы обычные рисунки.
Что-то типа этого, только здеть отображается текущее время
Код:
LoadFont(0,"Arial",28, #PB_Font_Bold) ; Загружаем жирный шрифт "Arial" с размером 28
Procedure DrawImageText() ; Эта процедура вызывается по таймеру каждую секунду
If StartDrawing(ImageOutput(1)) ; Приступаем к рисованию по рисунку с идентификатором 1 DrawingFont(FontID(0)) ; Используемый шрифт DrawText(20, 8, FormatDate("%hh:%ii:%ss",Date()) , RGB(120, 199, 151), 0) ; Рисуем текущее время StopDrawing() ; Завершаем рисование SetGadgetState(1,ImageID(1)) ; Обновляем рисунок в ImageGadget EndIf
EndProcedure
If OpenWindow(0,200,200,220,80,"Заголовок",#PB_Window_MinimizeGadget) If CreateGadgetList(WindowID(0))
CreateImage(1,200,60) ; Создаём рисунок с размерами 200х60 ImageGadget(1,10,10,200,60,ImageID(1))
SetTimer_(WindowID(0), 1, 1000, @DrawImageText() ) ; Запускает таймер, по которому будет каждую секунду вызыватся процедура DrawImageText()
Repeat Event=WaitWindowEvent() Until Event=#PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
Ну с украшательством вроде разобрались сапасибо.
С теорией насчет таймера вроде понятно но хотелось бы немного практики для примера как насчет фрагмента кода, был бы очень признателен. Мне вот представилось нечто такое
Код:
Procedure DinamSpisok() ; Эта процедура вызывается по таймеру каждую секунду ;Тут будет код процедуры проверки динамического списка ;Просматриваем все данные в динамическом списке и проверяем не пришло ли время передать данные устройству EndProcedure
If OpenWindow(0,200,200,220,80,"Заголовок",#PB_Window_MinimizeGadget) If CreateGadgetList(WindowID(0))
SetTimer_(WindowID(0), 1, 1000, @DinamSpisok() ) ; Запускает таймер, по которому будет каждую секунду вызыватся процедура DinamSpisok()
Repeat Event=WaitWindowEvent() Until Event=#PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
Цитата:
хотелось бы немного практики для примера как насчет фрагмента кода, был бы очень признателен. Мне вот представилось нечто такое
Правильно!
Код примерно такой
Код:
Structure Infa ; Это структура Count.l ; Это счётчик выдержки Command.s ; Ждесь текст, отображаемый на экране EndStructure
; Создаём динамический список с "прикошаченой" структурой. Теперь в каждом элементе списка будет по отдельной структуре Global NewList DataTimer.Infa()
Global AllCount=0 ; Это общее время работы
Procedure DinamSpisok() ; Эта процедура вызывается по таймеру каждую секунду ;Тут будет код процедуры проверки динамического списка ;Просматриваем все данные в динамическом списке и проверяем не пришло ли время передать данные устройству
; В цикле ForEach - Next сканируем динамический список от начала и до конца. ForEach DataTimer() Count=DataTimer()\Count ; Здесь хранится время до конца выдержки If Count<=1 ; ВСЁ, время вышло AddGadgetItem(0,-1,DataTimer()\Command) ; Отображаем текст в редакторе. Тут потом будем слать данные устройству DeleteElement( DataTimer() ) ; Удаляем элемент из динамического списка Else ; Время ещё есть DataTimer()\Count=Count-1 ; Уменьшаем счётчик EndIf Next
EndProcedure
If OpenWindow(0,200,200,400,180,"Заголовок",#PB_Window_MinimizeGadget) If CreateGadgetList(WindowID(0))
EditorGadget(0,4,4,392,172) ; Текстовый редактор
AddElement( DataTimer() ) ; Создаём новый эемент и добавляем в динамический список DataTimer()\Count=10 ; Пишем данные в структкру созданого элемента DataTimer()\Command="Таймер 1 - 10 сек."
Вот тут я озадачился
По потробней как это работает
что это значит Таймер 1 - 10 сек." Таймер 2 - 4 сек." неочень понятно может потомушто вечер и может я туплю неспорю может и туплю голова болит извиняйте может утром пойму когда высплюсь
Не я сно как добавлять в список новые таймеры и приетом добавлять три байта команды
Код:
AddElement( DataTimer() ) ; Создаём новый эемент и добавляем в динамический список DataTimer()\Count=10 ; Пишем данные в структкру созданого элемента DataTimer()\Command="Таймер 1 - 10 сек."
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
Цитата:
что это значит Таймер 1 - 10 сек." Таймер 2 - 4 сек."
Это только для вывода на экран и всё. Ну чтобы было понятно что за таймер завершил работу.
Цитата:
Не я сно как добавлять в список новые таймеры и приетом добавлять три байта команды
Для этого в структуре прописываем три переменные, попустим, с именами Byte1, Byte2, Byte3.
В них и будем сохранять эти 3 байта.
Структура будет иметь такой вид
Код:
Structure Infa ; Это структура Count.l ; Это счётчик выдержки Byte1.c ; 1 байт Byte2.c ; 2 байт Byte3.c ; 3 байт Command.s ; Ждесь текст, отображаемый на экране EndStructure
Для дого чтобы добавть новый таймер, мы добавляем новый элемент с помощью функции AddElement. Тосле чего этот элемент становится текущим и можно заполнять его структуру. Ну скажем так
Код:
AddElement( DataTimer() ) ; Создаём новый эемент и добавляем в динамический список DataTimer()\Count=10 ; Пишем данные в структкру созданого элемента DataTimer()\Command="Таймер 1 - 10 сек." DataTimer()\Byte1= 10 ; 1 байт DataTimer()\Byte2= 21 ; 2 байт DataTimer()\Byte3= 4 ; 3 байт
В переменную Count записывается время работы таймера в секундах. В переменной Command просто текст, ну чтобы понять какой таймер сработал. Нужно лишь для отладки В переменных Byte1, Byte2, Byte3 хранятся байты, которые нужно передать по окончанию выдержки Сейчас эти данные пыводятся на экран, но потом они будут отправлятся в порт.
Вот модифицированый код
Код:
Structure Infa ; Это структура Count.l ; Это счётчик выдержки Byte1.c ; 1 байт Byte2.c ; 2 байт Byte3.c ; 3 байт Command.s ; Ждесь текст, отображаемый на экране EndStructure
; Создаём динамический список с "прикошаченой" структурой. Теперь в каждом элементе списка будет по отдельной структуре Global NewList DataTimer.Infa()
Global AllCount=0 ; Это общее время работы
Procedure DinamSpisok() ; Эта процедура вызывается по таймеру каждую секунду ;Тут будет код процедуры проверки динамического списка ;Просматриваем все данные в динамическом списке и проверяем не пришло ли время передать данные устройству
; В цикле ForEach - Next сканируем динамический список от начала и до конца. ForEach DataTimer() Count=DataTimer()\Count ; Здесь хранится время до конца выдержки If Count<=1 ; ВСЁ, время вышло Text.s=DataTimer()\Command+" Байт 1 - "+Str(DataTimer()\Byte1) Text=Text+" Байт 2 - "+Str(DataTimer()\Byte2)+" Байт 3 - "+Str(DataTimer()\Byte3) AddGadgetItem(0,-1, Text) ; Отображаем текст в редакторе. Тут потом будем слать данные устройству DeleteElement( DataTimer() ) ; Удаляем элемент из динамического списка Else ; Время ещё есть DataTimer()\Count=Count-1 ; Уменьшаем счётчик EndIf Next
If CountList( DataTimer() )=0 ; В динамическом списке уже нет ни одного элемента KillTimer_(WindowID(0), 1) ; Уничтожаем таймер AddGadgetItem(0,-1,"Работа всех таймеров завершена") ; Отображаем текст в редакторе. EndIf
EndProcedure
If OpenWindow(0,200,200,400,180,"Заголовок",#PB_Window_MinimizeGadget) If CreateGadgetList(WindowID(0))
EditorGadget(0,4,4,392,172) ; Текстовый редактор
AddElement( DataTimer() ) ; Создаём новый эемент и добавляем в динамический список DataTimer()\Count=10 ; Пишем данные в структкру созданого элемента DataTimer()\Command="Таймер 1 - 10 сек." DataTimer()\Byte1= 10 ; 1 байт DataTimer()\Byte2= 21 ; 2 байт DataTimer()\Byte3= 4 ; 3 байт
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
Да и ещё.
Рекомендую немного подправить подсветку синтаксиса в редакторе пурика, а то при стандартной структуры сложно отличать от остального текста.
Для Этого нужно открыть окно настроек и перейти в раздел Импорт/Экспорт.
Там указать путь к файлу Pref_pb_4_00.prefs (он в архиве).
http://www.filehoster.ru/files/ch4879 И импортировать данные
Вроде дошло спасибо вчера тупил. Значит данные мы потом будем брать из Byte1.c ; 1 байт, Byte2.c ; 2 байт, Byte3.c ; 3 байт и отправлять их в процедуру отправки в порт.
Эти строки даны для понимания сттруктуры в качестве примера работы структуры. В дальнейшем я так понимаю добавим фрагмет кода который позволит добавлять новые данные в структуру из текстового редактора в формате м:с, 1,1,1. где три 111 это три байта данных. Если я что-то неправильно понял поправте меня.
AddElement( DataTimer() )
DataTimer()\Count=4
DataTimer()\Command="Таймер 2 - 4 сек."
DataTimer()\Byte1= 40 ; 1 байт
DataTimer()\Byte2= 51 ; 2 байт
DataTimer()\Byte3= 7 ; 3 байт
Я надеюсь вы обясните мне каким образом довисти этот код до ума чтобы добавлять новые таймеры в структуры из текстового редактора я думаю может кнопку сделать типа "Добавить новое событие" которая будет вызывать функцию "AddElement( DataTimer() ) ; Создаём новый эемент и добавляем в динамический список " а эта функция если я правильно понимаю создаст таймер и добавит данные в структуру введенные после нажатия этой кнопки я приав или нет ?????
что вы понимаете под куском реального файла это файл с в котором будет хранится с ценарий или файл с кодом обшей программы
Я приложил в архиве пример сценария от одной из буржуйских програм в табличном формате csv еще я видел сценарии в формате mdb тоже табличный формат
ссылка на архив
http://alexval2007.ucoz.ru/piro_pult/ShowSample2.zip
Его нужно ведь нетолько загружать но нужно гдето и редактировать создавать этот сценарий такчто какойто редактор серавно нужен а то что читать из файла так я не спорю удобней только список надо отображать что за чем идет
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
Цитата:
понимаете под куском реального файла это файл с в котором будет хранится с ценарий
Да. Но только если нужна совместимость с форматом файла буржуйской проги. Если совместимость не нужна, но это упрощает дело, т. к. можно сделать удобный для этого случая формат.
Цитата:
создавать этот сценарий такчто какойто редактор серавно нужен а то что читать из файла так я не спорю удобней только список надо отображать что за чем идет
совместимость ненужна просто для примера привел
добавлено позже
Отлично только можно столбец имя в конец перенисти а время вперед
в вормате время байт1 байт2 байт3 Имя
да и эту таблицу хороши бы показывать в програме для визуализации самого процеса и что зщачем идет имя и тп
Насчет редактирования в другом окне полностью согласен в буржуйских программах так и сделано редактор вызывается в виде дополнительного окна
Зарегистрирован: Вс мар 30, 2008 14:31:51 Сообщений: 331
Рейтинг сообщения:0
Цитата:
надеюсь вы обясните мне каким образом довисти этот код до ума
На пальцах не объяснить.
Тут нужно писать код, причём много для того, чтобы прога нормально работала. К сожалению у меня нет столько свободного времени.
То что я выкладывал это лишь примеры.
Нам иногда приходится прикошачивать свои железки к компу через один из портов, например LPT порт. Думаю те кто пробовал это сделать и писал прогу под винду, наверное знают что NT системы не позволяют получить прямой доступ к порту. Для этого нужно использовать драйвер. Вот как раз о драйвере дальше пойдет речь. Во вложении находится драйвер режима ядра ОС, аналог inpoit32.dll, написанный на PureBasic. Он в месте со всеми исходниками, что будет полезно если нужно создать свой драйвер либо же просто понять как самому написать драйвер и работать с ним из приложения, т. е. инсталлировать его, обращаться к нему, выгружать драйвер и т. д. Размер DLLки в месте с драйвером, вкошаченым в нее, около 10 КБ что в несколько раз меньше чем inpoit32.dll. Драйвер проверен и нормально работает на ОС: Windows 2000, Windows XP и Windows 7.
В DLL 4 функции.
Цитата:
Inp(PortAddress.u) ; Чтение байта из порта, адрес которого указан в 'PortAddress'. Out(PortAddress.u, Byte.a) ; Запись байта в порт, адрес которого указан в 'PortAddress'. Status() ; Статус драйвера. Если ошибок нет, то 0. Version() ; Версия программы в виде Float числа.
Функцию Status() желательно вызвать после загрузки DLL и перед работой с ее функциями. Она может вернуть следующие значения.
Цитата:
0 - Все ОК, драйвер работает. 1 - Ошибка извлечения драйвера на диск. 2 - Ошибка установки драйвера. 3 - Ошибка доступа к драйверу.
Примеры использования драйвера.
Чтение/запись в LPT1.
Код:
Err = Status() If Err<>#PBIO_OK MessageRequester("", "Ошибка драйвера "+Str(Err)) EndIf
Out($378, 120) Byte = Inp($378)
MessageRequester("", Str(Byte))
Чтение текущей температуры процессора и чипсета через порты $295 и $296.
Код:
#ADR_REG = $295 ;Это адреса регистров системной платы, с помощью которых можно узнать температуру #DATA_REG = $296
Procedure Termo() ; Эта процедура вызывается по таймеру каждую секунду Out(#ADR_REG, $2B) ; Получает текущую температуру процессора x=Inp(#DATA_REG) SetGadgetItemText(0,0,StrU(x, #PB_Byte)+" °C",1) ; отображаем её в таблице
Out(#ADR_REG, $29) ; Получает текущую температуру системной платы x=Inp(#DATA_REG) SetGadgetItemText(0,1,StrU(x, #PB_Byte)+" °C",1) ; отображаем её в таблице EndProcedure
Err = Status() If Err<>#PBIO_OK MessageRequester("", "Ошибка драйвера "+Str(Err)) EndIf
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения