Excel и автоматический сбор данных.

Excelsior сборка данных


Вопрос о получении данных в Excel довольно подробно разобран на бывшем pcports, а ныне kernelchip.ru, единственная проблема это то, что приведенные примеры относятся к старым версиям Excel и mscomm32.ocx и в новых операционных системах (напр. w7) это все не поддерживается. Activex компонент mscomm32.ocx не устанавливается в семерку и не поддерживается новыми версиями офиса. Не знаю с чем это связано, но мне так и не удалось найти встроенный аналог этого компонента в VBA, зато нашелся бесплатный компонент совместимый и с w7 и с новым офисом — https://home.comcast.net/~hardandsoftware/NETCommOCX.htm управление им такое же как mscomm.ocx только немного другие названия.
Подробно про управление com портом c помощью mscomm ( в NETComm все то же самое ) — http://www.firststeps.ru/vb/mscomm/mscomm1.html, довольно подробно про VBA Excel – http://www.firststeps.ru/vba/excel/vbaexcel1.html,
ну и пример работающей программы — контроллер раз в несколько секунд отправляет в Excel значения четырех каналов АЦП:
Dim I As Integer
Dim Str As String
Private Sub CommandButton1_Click()
REM   Настройка порта и начальное значения счетчика I
    NETComm1.CommPort = 5
    NETComm1.Settings = "57600,N,8,1"
    NETComm1.Handshaking = comNone
REM   По одному байту(символу) NETComm1.InputLen = 1  умолчально - 0 т.е. читает буфер и обнуляет
    NETComm1.InputLen = 0
    NETComm1.InBufferSize = 40
    NETComm1.OutBufferSize = 40
REM    NETComm1.RThreshold = 0  если ноль не работает событие приема NETComm1_OnComm() если 16 событие   
REM    возникает при получении 16 символов(байт) 
    NETComm1.RThreshold = 16
    NETComm1.SThreshold = 0
REM    Открываем порт
    If NETComm1.PortOpen = True Then Label1.Visible = True Else: NETComm1.PortOpen = True
    If NETComm1.PortOpen = True Then Label1.Visible = True
    If NETComm1.PortOpen = True Then CommandButton1.Enabled = False
    I = 1
End Sub

Private Sub CommandButton2_Click()
    If NETComm1.PortOpen = True Then NETComm1.PortOpen = False
    Label1.Visible = False
    If NETComm1.PortOpen = False Then CommandButton1.Enabled = True
End Sub


Private Sub NETComm1_OnComm()
    Str = NETComm1.InputData
    ActiveSheet.Columns(10).Rows(I).Value = Left(Str, 4)
    ActiveSheet.Columns(11).Rows(I).Value = Left(Right(Str, 8), 4)
    ActiveSheet.Columns(12).Rows(I).Value = Left(Right(Str, 12), 4)
    ActiveSheet.Columns(13).Rows(I).Value = Right(Str, 4)
    I = I + 1
    If I = 21 Then NETComm1.PortOpen = False
    If NETComm1.PortOpen = False Then CommandButton1.Enabled = True
    If NETComm1.PortOpen = False Then Label1.Visible = False
End Sub

— получаем строчку из 16 символов(байт), в подпрограмме обработки этого события(NETComm1_OnComm())
разбираем ее райтами и лефтами на четверки байт и пихаем в соответствующие ячейки. После двадцати измерений порт отключается. Тут тонкое место, в передаваемых байтах первая тетрада должна быть равна 3(в кодировке ASCII зто значит число), тогда Excel все правильно понимает, выбрасывает нули спереди и считает данные числом. Четверки байт появились из-за того, что результат преобразования используемого десятиразрядного АЦП четырехзначен (0-1023) и при его разборе получаются четыре цифры. Понятно что и с например, двенадцатиразрядным АЦП будет тоже самое. Ну и результат-)
  • +8
  • 11 июля 2014, 14:34
  • basil

Комментарии (47)

RSS свернуть / развернуть
Прикольно, даже не знал что в офисе есть такое. Но как на меня, это уже какое то извращения.
0
Может я не в курсе конкретных требований, но месье знает толк в извращениях…
Python + matplotlib в помощь. Кроссплатформенно, быстро, просто.
0
Также весьма хорош gnuplot. Но все опять сводится к требованиям к задаче. А из поста они весьма абстрактны; к тому же, basil, что бы делал, не найдя подобный компонент? :-)
0
Ну во первых, это просто-)(я имею в виду VBA), и во-вторых Excel де-факто стандарт на всех предприятиях, ну по крайней мере его знают народу больше чем что-либо еще. То-есть если это будут использовать то базовые знания как правило уже будут. А компоненты, ну в крайнем случае пойдут условно бесплатные типа как отечественный strokereader.
0
А в самом крайнем случае можно и свой написать. На Delphi, например, неплохо пишутся, AFAIK.
0
Не буду спорить, особенно не зная цели применения, и если задача была решена именно так, как планировалось и требовалось.
По поводу стандарта де факто — у жены, работающей на госпредприятии используют OpenOffice.
Касаемо экспорта и генерации какой-то отчетности в последний Excel. Хотел сделать подобное на Qt, но нормальных библиотек не нашел (ActiveX тот еще костыль). Теперь отчеты генерируются в html и pdf, о чем ни капли не жалею.
0
Теперь отчеты генерируются в html и pdf, о чем ни капли не жалею.
+
0
Можно без всяких извращений использовать xml формат — генерируется хоть чем и из чего угодно. Потом открывайте Excel'ом и смотрите. Хотя можно и левой рукой правое ухо чесать.
0
xml — это как раз геморой, древним стандартом для Excel(и видимо любых электр.таблиц) является импорт простейших текстовых файлов с разделителями — CSV.
0
в csv только данные, через xml больше возможностей. да и проблем нет никаких с ним (xml)
0
Но у него там кнопочки, формочка, т.е. все такое для удобства. Вообще, у MS все круто:D И VBA круто — без всяких сред программирования можно написать свое приложение, имея под рукой только Word или Excel, и ActiveX(OCX) компоненты — круто, бросил dll-ку в windows\system32, зарегистрировал ее один раз в системе и работай с ней через ее объектную модель, практически все ПО у них(в т.ч. Office), как и сама ОС, — объектно-ориентированное, т.е. с ним элементарно работать даже из WSH (Windows Script Host) системных скриптов, написанных на javascript(JScript) или VB. Единственное, что мне не нравится с VBA — это то, что они не сделали поддержку JScript в Office и надо писать на немодном/проприетарном/нестандартном (в отличии от javascript) языке.
0
как и сама ОС, — объектно-ориентированное

Сама ОС (Win32Api) – чистый Си.
0
API — сишный, но идеология большей части Win32API, и особенно оконной системы — объектная.
0
Не сказал бы. Что там ООПшного? Инкапсуляция данных объектов ядра внутри, и доступ к ним через идентификаторы (хендлы)?
0
Хотя бы и это. Но ярче всего проявляется в оконной системе, где доступны и наследование с полиморфизмом.
0
Спорить не буду. Местами что-то есть. Но местами, общей идеологии нет, все API очень разношорстно. Так можно приписать ООП много чему, например, юникосвой VFS и их идеологии «все есть файл».
+1
Ну, помимо прочего, кто-то из M$ (ЕМНИП) писал, что оконная система вдохновлялась именно принципами ООП — и ее терминология взята оттуда же, только «объект» заменен на «окно».
Ну и подход с хендлами свойственен именно процедурной обертке на ООП. И то, что большинство хэндлов закрывается одной функцией тоже в пользу того говорит.
0
 И то, что большинство хэндлов закрывается одной функцией тоже в пользу того говорит.

Ну да, местами идеологию ООП там можно увидеть.Но слишком все разношорстно. Да, часто хендлы закрываются универсальной CloseHandle(). Но там сборная солянка из разных подходов. Например

CreateFile() работает через хендл, данные инкапсулирует, закрывается CloseHandle().

InitializeCriticalSection(), данные не инкапсулирует, закрывается DeleteCriticalSection()

socket() работает через идентификаторы, но другие, не те которые хендлы, данные инкапсулирует. Закрывается closesocket()
0
С разнородностью не поспоришь, да. А сокеты вообще насколько я знаю из позикса утянуты вместе с АПИ.
Но в весьма многих местах прослеживается влияние ООП, а в некоторых местах — открытым текстом. В некоторых местах — и без С-обертки (COM-based API, DirectX например).
+1
Да, сокеты из posix.

DirectX  (и COM в частности) внешне выглядит как ООП. В некоторых местах — это действительно «наивный» интерес, в других — это прослойка поверх Win32API. Но ИМХО, это не делает ОС «объектно ориентируемой».
+1
Ладно, заменим «объектно ориентированная» на приспособленная под несложное программирование приложений средствами ООП-подобных инструментов.
0
Ага, тогда MS-DOS тоже объектно-ориентированная ОС, там ведь можно было несложно программировать приложения в ООП'шной Turbo Vision.
+1
Нет, как раз таки оконная система (на которую чаще всего и накладывают ООП-обертки, смолток-лайк ООП вручную на С — слишком сурово) — самый настоящий ООП.
0
DirectX  (и COM в частности) внешне выглядит как ООП
Я бы даже сказал, что только выглядит) Таких возможностей, как наследование оно не предоставляет. Просто интерфейс на объектах.
И я не говорил, что вся система объектно-ориентирована. Я говорил, что оконная система — ООП и у большой части других разделов WinAPI интерфейс сильно напоминает процедурную обертку над ООП-системой.
0
Я бы даже сказал, что только выглядит)

Полностью согласен.

Таких возможностей, как наследование оно не предоставляет. Просто интерфейс на объектах

Ну, можно реализовать наследование через агрегацию. Хотя это больше притягивание за уши…
0
Имелось в виду понятие окна(Window) в Windows и механизма сообщений, который привязан к окнам.
0
 механизма сообщений, который привязан к окнам.

Ну, опять же, особо спорить не буду.

Механизм сообщений/событий это обычный подход, который реализован в куче API (да в той же FreeRTOS), ибо это удобный механизм асинхронного взаимодействия. На базе этого можно построить ООП (как в идеологии ObjectiveC), но сам механизм — это не ООП.
+1
На базе этого можно построить ООП
Ну вот для этого и задумано было все, чтобы почти мгновенно для Windows 95 появились разного рода инструменты для быстрого говнокодирования, использующие чисто утилитарные и понятные даже детям принципы ООП, типа: Delphi, Visual Basic, Visual FoxPro, 1С и пр.
0
Чет я не понял вашего искрометного юмора. ООП появилось задолго до Windows 95. И что плохого в «Delphi, Visual Basic, Visual FoxPro, 1С и пр»?
0
Имелось в виду то, что под MS DOS мало кто программировал на ООП, кроме рафинированных, а на Windows это ВНЕЗАПНО стало стандартом де-факто.
0
Там не только в мессагах дело, в целом окна — это объекты, обменивающиеся сообщениями — как в смолтоке. Ну и плюс возможности создавать классы, объекты-окна этих классов и модифицировать поведение уже имеющихся — три краеугольных камня ООП в наличии, хотя и в несколько непривычном виде для привыкших к симула-подобному ООП.
+1
Сами окна я не особо хотел трогать, т.к. e_mc2 сразу же бы начал вещать о том, что это не ОС(а тем более не его ядро), а всего-лишь GUI надстройка :D Хотя и очень сильно интегрированная в ОС и в ядро, на что я и намекнул упомянув очередь сообщений, кроме того — это и есть основа event-ориентированных механизмов, т.е. некой части идеологии ООП в понимании Windows.
0
это и есть основа event-ориентированных механизмов, т.е. некой части идеологии ООП в понимании Windows

Эм, может я что-то упустил, но какая прямая связь между асинхронными событиями и ООП? Обработка событий через машину состояний — это уже ООП?
0
о какая прямая связь между асинхронными событиями и ООП?
Три кита для быстрого программирования классического виндового приложения — это: свойства, методы и события уже готовых объектов.
-1
Я знаю о терх китах ООП, это инкапсуляция, наследование и полиморфизм.

А вот о
Три кита для быстрого программирования классического виндового приложения
я не знаю. А чем, принципиально, отличается «программирование классического виндового приложения» от создания приложения для другой платформы, будь то нативный Linux, Android, Mac OS X или QNX?
+2
инкапсуляция, наследование и полиморфизм
Этого ничего не знает(и ему это обычно совсем не нужно) тот, кто программирует на перечисленных мной языках, но понимает то, что я перечислил (без особых напрягов, чисто интуитивно) — ООП для широких масс, как и VBA с уже готовыми объектными моделями, как и javascript с уже готовым DOM.
-1
Этого ничего не знает(и ему это обычно совсем не нужно) тот, кто программирует на перечисленных мной языках
Да полно, это уже не программист, а кодер. «Три кита» рассказываются и объясняются даже в книгах уровня «С++ для чайников».
+1
Причем здесь этот C++ — я тебе факты говорю про 80-90% объема всего пишущегося в стране кода.
-1
При том, что по твоим «фактам» пишутся только кривые утилитки на несколько килострок кода. И да, чтобы называть их «фактами» тебе следует привести пруфы.
И ключевое слово было не «С++», а «для чайников».
0
Кто и что пишет на C++ — я не знаю, но судя по сайтам вакансий проггеров — это проценты (может даже доли процентов). Огромное число людей (ради весьма неплохого бабла) пишут на 1С. Потом идет C#, javascript и еше java щас пошла(видимо из-за Android бума). Ты много говоришь о C++, а сам сидел(а может и щас еше сидишь) на Delphi, какое такое НАСТОЯЩЕЕ ООП в стиле C++?
-1
Еще раз, причем тут С++? Понятие трех китов применимо к любому ООП языку и описывается даже в книгах серии «для чайников».
какое такое НАСТОЯЩЕЕ ООП в стиле C++?
А что такое «НАСТОЯЩЕЕ ООП в стиле С++»? Впервые о таком слышу.
Огромное число людей (ради весьма неплохого бабла) пишут на 1С.
Ты еще кобол вспомни…
+1
Еще раз повторяю: инкапсуляция, наследование и полиморфизм не используют люди в такого рода кодировании, т.к. юзают уже готовые объектные модели(готовые или уже встроенные классы/библиотеки). Какое наследование? Экземпляры объектов создаются конструкциями типа new Готовый_объект или CreateObject(«Готовый_объект») или object = Готовый_объект, и все. А потом уже работают с их свойствами и методами.
Короче, что-то типа как программирования на Arduino с готовыми библиотеками, но не написание этих самых библиотек.
-1
Ты мне еще про программирование расскажи, ага.
И еще раз, подходы быдлокодеров, способных в той же дельфи только компоненты на форму накидать меня не интересуют. Ничего кроме автошемы они не напишут.
Что же до программистов на Delphi, JS, Java и прочих — о, они прекрасно знают что такое ООП, из чего состоит и как применяется. И применяют.
+1
Что же до программистов на Delphi, JS, Java и прочих — о, они прекрасно знают что такое ООП, из чего состоит и как применяется. И применяют.
Про javu не знаю — я никогда не видел реальных листингов коммерческого кода. Но подозреваю, что и там многие юзают именно такой вариант, если судить по старым публикациям и книжкам по java. Про Delphi ты уже написал — это было давно уже, я тоже видел массу такого кода. Тоже самое могу сказать про код на VB, а особенно на VBA, но это тоже было уже давно. На javascript у нас всех торкнуло программировать, используя ООП совсем недавно (года 2-3 назад), когда гениальный парнишка в штатах написал библиотеку JQuery и после этого всех ВНЕЗАПНО подвигло писать книжки про ООП паттерны программирования для javascript и хабрамены их прочитали. До этого же почти весь код javascript в инете и в учебниках по нему — был типичный процедурный код + манипулирование готовыми объектами DOM (т.е. ООП только в этом смысле) — это я точно знаю.
0
2006 — это два-три года назад?
Что до ранних применений JS — действительно, чтобы менять картинку по onmouseover создавать свои объекты не требовалось.
+1
Не 2006 — она раскрутилась и распиарилась РЕАЛЬНО только в 2008-2009, а стала МОДНОЙ в 2010-2011-м. Там еще было такое мнение, что многие говорили: а не дох… я-ли javascripta — это вам не приложения говнокодить — это всего-лишь скрипты. Понятия web-приложения еще не было или оно не привилось, кроме того многие компы тогда еще были реально слабоваты.
0
без обид, но это ад и прихваты из начала нулевых (если не девяностых), как бы лично вам это ни казалось просто и стабильно. абзац, следующий перед примером кода, однозначно демотивировал так делать; абзац же после примера кода напомнил про мышей и кактус.
хотя если в ТЗ прописано, мол, именно ёкселем — то тут, конечно, только печаль и сочувствие. под 2к7 писал для себя заполнялку отчёта кассира-операциониста на вбейсике — сделал, но до сих пор хочу развидеть этот ёбаный ад.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.