Все-таки графический режим Спекки - 256х192. А если писать на асме и немного извратиться, используя бордюр, то можно расшириться до 320х240. Рекомендую поискать в сети и посмотреть демки 64к. Там ребята вытворяли невероятное.
Делал в своё время частотомер на AT90S2313. Контроллер, дешифратор (ИД7, если не изменяет склероз), светодиодный индикатор на 8 разрядов. Программу писал на ASM'е в AVRStudio. Измерял частоту, период, длину положительного и отрицательного импульсов до 1 MHz (режим измерения переключался последовательно нажатием одной кнопки). Вроде даже плата до сих пор в кладовке где-то лежит.
А что мешает использовать двойную адресацию? Внешняя - 1-255, внутренняя - произвольная. Опрашиваются 255max адресов, слэйв в ответе пересылает свой внутренний адрес.
RS485 - это интерфейс. По спецификации поддерживает подключение до 256 устройств, т.е. в 32-битном адресе нет смысла. О протоколе, к-рый (якобы) используется в данном опусе - ни слова. И при описанном алгоритме получить 100% результат - маловероятно. Причина банальна: помехи. Именно поэтому используются кодированный запрос/кодированный ответ.
У меня вопрос по fnRC2A1B2(1, 1, nn, 1) — нафига? Почему не: With CFG.Cells(1, 1).Resize(nn, 1)?
Это старая история... Как-то столкнулся с тем, что конструкция вида Sheet.Range(Cells(1, 1), Cells(2,2)) не работает на неактивном листе. В то же время Sheet.Range("A1:B2") отрабатывает без каких либо проблем. Недолго думая набросал функцию перевода координат из формата R1C1 в формат A1 и на этом успокоился. (программист ленив... :D ) Про Resize мне в то время не попалось, да и функция оказалась удобной. Висит у меня в надстройке, если надо быстро узнать диапазон в формате A1, то формула работает прямо на листе. А так да, если рассматривать с точки зрения избыточности, то без нее можно обойтись. ( и да, я в курсе, что можно записать и так: Sheet.Range(Sheet.Cells(1, 1), Sheet.Cells(2,2)) и оно будет работать, но мне такая запись не понравилась. :-) )
По сути верно, происходит конфликт форматов, что и нужно учитывать при использовании Value. Или использовать другой метод.
Поэтому ситуация «ой, мне надо еще пару строк в конфиг» — типичная.
Пару строк можно добавить и вручную, это прерогатива программиста. Пользователь же работает именно с фиксированным списком, давать ему возможность добавлять/удалять строки - неразумно.
Ну и, чтобы не быть голословным, вот пример функции чтения/записи по заданному ключу:
Option Explicit
Private Function fnRC2A1B2(vRow1 As Long, vCol1 As Integer, vRow2 As Long, vCol2 As Integer) As String
fnRC2A1B2 = Split(Cells(1, vCol1).Address(True, False, xlA1), "$")(0) + CStr(vRow1) + ":" + _
Split(Cells(1, vCol2).Address(True, False, xlA1), "$")(0) + CStr(vRow2)
End Function
Function fnDataConfig(aKey As Variant, Optional aItem As Variant = Empty) As Variant
Dim c As Object, nn As Long
nn = CFG.Cells(Rows.Count, 1).End(xlUp).Row
With CFG.Range(fnRC2A1B2(1, 1, nn, 1))
Set c = .Find(What:=aKey, After:=CFG.Cells(nn, 1), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
If aItem = Empty Then
fnDataConfig = c.Offset(0, 1).Value
Else
c.Offset(0, 1).Value = aItem
fnDataConfig = True
End If
Else
If aItem = Empty Then
fnDataConfig = "Not Found"
Else
' ===== необходимость добавления весьма сомнительна
' CFG.Cells(nn + 1, 1).Value = aKey
' CFG.Cells(nn + 1, 2).Value = aItem
' fnDataConfig = "Not Exists, Added"
' =====
fnDataConfig = "Not Exists"
End If
End If
End With
Set c = Nothing
End Function
подозреваю, что конфиг автора не очень большой, так что разница будет неощутимой.
А качество кода в расчет уже не берется? По сути, опубликованное выше можно охарактеризовать, как "bloatware", т.к. налицо явная избыточность. К тому же Find работает значительно быстрее цикла, на списке в 1000 строк при чтении последнего ключа разница в порядок, т.е. в 10 раз.
Ну и напоследок вишенка на торт: если в вышеприведенном творчестве задать ключ "10", например (подойдет любое число в строковом формате), то при перезаписи этого ключа он будет дописываться в конец таблицы, а прочитать его значение не получится.
Для наглядности:
ConfigSheet.Config("10") = "тест"
данная конструкция при каждом вызове будет добавлять новую запись. В то же время записанное значение не читается:
aa = ConfigSheet.Config("10")
переменная получает значение Empty. (причина, надеюсь, ясна)
P.S. Поскольку конфиг - это фиксированный список с изменяемыми значениями, также вызывает сомнение необходимость добавления/удаления строк.
А зачем так громоздко? Да еще и циклы... (для справки: можно использовать Find) Как понял, все сводится к "прочитать/записать/добавить/удалить". Решается тремя функциями, работает на порядок быстрее.
Information
Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Полный размер экрана "гуляет" в зависимости от клона.
Все-таки графический режим Спекки - 256х192. А если писать на асме и немного извратиться, используя бордюр, то можно расшириться до 320х240. Рекомендую поискать в сети и посмотреть демки 64к. Там ребята вытворяли невероятное.
Делал в своё время частотомер на AT90S2313. Контроллер, дешифратор (ИД7, если не изменяет склероз), светодиодный индикатор на 8 разрядов. Программу писал на ASM'е в AVRStudio. Измерял частоту, период, длину положительного и отрицательного импульсов до 1 MHz (режим измерения переключался последовательно нажатием одной кнопки). Вроде даже плата до сих пор в кладовке где-то лежит.
А что мешает использовать двойную адресацию? Внешняя - 1-255, внутренняя - произвольная. Опрашиваются 255max адресов, слэйв в ответе пересылает свой внутренний адрес.
RS485 - это интерфейс. По спецификации поддерживает подключение до 256 устройств, т.е. в 32-битном адресе нет смысла. О протоколе, к-рый (якобы) используется в данном опусе - ни слова. И при описанном алгоритме получить 100% результат - маловероятно. Причина банальна: помехи. Именно поэтому используются кодированный запрос/кодированный ответ.
Да, начиная с Висты.
Писать приложение на VB.NET для системы, где dotNET отсутствует... Сильно... Для WinXP? Т.к. начиная с Висты dotNET ставится с ОС по умолчанию.
Не проще ли написать надстройку на VBA, к-рая не создаст никаких проблем на ограниченном аккаунте?
Это старая история... Как-то столкнулся с тем, что конструкция вида Sheet.Range(Cells(1, 1), Cells(2,2)) не работает на неактивном листе. В то же время Sheet.Range("A1:B2") отрабатывает без каких либо проблем. Недолго думая набросал функцию перевода координат из формата R1C1 в формат A1 и на этом успокоился. (программист ленив... :D ) Про Resize мне в то время не попалось, да и функция оказалась удобной. Висит у меня в надстройке, если надо быстро узнать диапазон в формате A1, то формула работает прямо на листе. А так да, если рассматривать с точки зрения избыточности, то без нее можно обойтись. ( и да, я в курсе, что можно записать и так: Sheet.Range(Sheet.Cells(1, 1), Sheet.Cells(2,2)) и оно будет работать, но мне такая запись не понравилась. :-) )
По сути верно, происходит конфликт форматов, что и нужно учитывать при использовании Value. Или использовать другой метод.
Пару строк можно добавить и вручную, это прерогатива программиста. Пользователь же работает именно с фиксированным списком, давать ему возможность добавлять/удалять строки - неразумно.
Ну и, чтобы не быть голословным, вот пример функции чтения/записи по заданному ключу:
А качество кода в расчет уже не берется? По сути, опубликованное выше можно охарактеризовать, как "bloatware", т.к. налицо явная избыточность. К тому же Find работает значительно быстрее цикла, на списке в 1000 строк при чтении последнего ключа разница в порядок, т.е. в 10 раз.
Ну и напоследок вишенка на торт: если в вышеприведенном творчестве задать ключ "10", например (подойдет любое число в строковом формате), то при перезаписи этого ключа он будет дописываться в конец таблицы, а прочитать его значение не получится.
Для наглядности:
ConfigSheet.Config("10") = "тест"
данная конструкция при каждом вызове будет добавлять новую запись. В то же время записанное значение не читается:
aa = ConfigSheet.Config("10")
переменная получает значение Empty. (причина, надеюсь, ясна)
P.S. Поскольку конфиг - это фиксированный список с изменяемыми значениями, также вызывает сомнение необходимость добавления/удаления строк.
А зачем так громоздко? Да еще и циклы... (для справки: можно использовать Find) Как понял, все сводится к "прочитать/записать/добавить/удалить". Решается тремя функциями, работает на порядок быстрее.