PDA

Просмотреть полную версию : Различные макросы


WhiteM
29.01.2008, 11:30
Для разборки и обсуждения (кому интересно или просто нечего делать :)

WhiteM
29.01.2008, 11:36
Ставится между выходом ВоКал и аналоговым выходом

WhiteM
29.01.2008, 11:39
Вход - с кнопки выход - целое число (int) - 1.2.3
С памятью на случай проподания питания.
Использовал для переключения вентиляторов.

WhiteM
29.01.2008, 11:42
Подставляет в летнем режиме Тобр прогрев вместо Тобр.
Пригодился в подвале (холодно), когда на улице лето.

WhiteM
29.01.2008, 11:47
Отображает состояния различных устройств в нижней строке.
Есть переход на отображение изменившегося состояния. если ничего не меняется - то идёт простая смена надписей.

Да, работой этого макроса не доволен, но другого нет.

Может кто что подскажет.

WhiteM
29.01.2008, 11:51
Да, совсем забыл... В виду того, что публикация не планировалась, описания либо отсутствуют, либо в минимальных размерах.

Заранее прошу прощения.

WhiteM
25.06.2008, 16:53
Макрос таймера на 4 события в день. Переделан из версии 2.05

Необходимо тестирование.

Кто проверит - отпишитесь. ;)

Arsie
27.06.2008, 11:37
Тогда уж, в догонку, наборчик :)

MSGroup
03.07.2008, 13:04
Mega-расписание.
-любое колличество строк (задается настройкой макроса)
-доминутная настройка точек
-задание 3-х уставок (Т,Р,User)
-легко встраивается в стандартные проекты SMH.
Протестирован.

Недостаток: очень большое колл. FBD-блоков.

Sergey Cherevko
25.12.2008, 19:37
А вот почему бы не использовать графический экран Пиксела в своих корыстных целях?
Шкалу какую-нибудь не нарисовать или красивый индикатор?
На затравку предлагаю макрос логотипа и "хранителя экрана". Времена задаются в тиках. Если "хранитель" экрана не нужен - то его время задать равным нулю.

vladun
27.02.2009, 21:43
Народ, а кто может поделиться/составить макрос для Excel, что бы вести лог сигналов из памяти контроллера ? Т.е. чтобы в таблицу забивались данные с определенной дискретностью (ограничиваемой сверху пропускной способностью МОДБаса), а уже на основании таблицы строить автодиаграмму.
И совсем неплохо было бы, еслиб еще и на печать автоматом выводилось при достижении определенного количества строк (или по времени) и в архив скидывалось.
PS: во губу раскатал, правда ? :)

LordN
27.02.2009, 22:39
и чтоб без участия ОРС-сервера?

AlexG
28.02.2009, 08:49
А Excel обязателен? Я бы взял для этого простенькую скаду. Можно даже с экспортом в Excel.

vladun
28.02.2009, 12:14
и чтоб без участия ОРС-сервера?
Ну почему же, с ОРС конечно...
Скады не подходят т.к. денег требуют и пользователей учить надо, а с экселем каждый справится.

AlexG
28.02.2009, 15:13
Эксель последнее время тоже денег требует :(
Если дать пользователям готовый проект то можно и не учить.

vladun
28.02.2009, 15:29
Эксель требует значительно меньше, да и есть он почти везде, мне его легальность не нужна, я его ставить не собирался.
На ум приходит только фриваре KVisionOPC и лектус с получасовым "халявным" пробегом". Опять же, потому как продавать софт мне не хочется.

AlexG
28.02.2009, 16:45
Я бы использовал Сomplex Systems Modbus OPС (абсолютно бесплатен), еще вариант - Овен OPC (жрет ресурсы и неизвестно как к его использованию отнесется Овен)
В качестве скады DataRate (3500р, три месяца работы бесплатно) другой вариант MasterSCADA (32 точки бесплатно).
Kvision не ведет архивов и вообще довольно убог. Я попробовал его применить для одной задумки и понял что это безперспективно.

vladun
01.03.2009, 02:58
Спасибо за наводку !
А прямой ссылочки на MasterScada случаем нету ?

AlexG
01.03.2009, 08:41
masterscada.ru ?
DataRate старых версий тоже точек до 60 бесплатен.

LordN
01.03.2009, 22:51
дык она тут у сегнетиков выложена вроде.. из неё автоскада и пашет.

LordN
01.03.2009, 23:02
блин, опять куда-то все запрятали хер найдёшь... раньше как-то легко на неё попадал..

LordN
01.03.2009, 23:06
через задницу, но влез :)
http://www.segnetics.com/main.aspx?Page=233
http://www.insat.ru/products/?category=8

vladun
02.03.2009, 01:14
Спасибо коллега, но мне бы "Прямую" в прямом смысле, а у Сегнетиков лежит старая 2.4 ;)

AlexG
02.03.2009, 10:46
с прямой облом, дистрибутив где-то на ftp под паролем. нужно писать в техподдержку инсата.

Arsie
02.03.2009, 10:55
Такой пример у нас на сайте уже года два валяется ;) Перенёс на форум.

http://forum.segnetics.com/showthread.php?postid=3470#post3470

vladun
02.03.2009, 12:43
Спасибо, этот пример я видел, но это не совсем то...
Тут нужно посылать данные в журнал (а если дискретность 0.1 сек ?) а потом по кнопке считывать в таблицу.
Мне нужно, чтобы данные с ОРС (из памяти Logixa) писались построчно в таблицу по мере их появления на переменных МОДбаса, т.е. с помощью экселя я собираюсь строить тренды, а потом их распечатывать (сохранять и вообще редактировать если что).

Arsie
02.03.2009, 14:34
Хм... Посмотрите, в папке "Экзампле" (искать там, куда лектус установился) есть пример, как данные из лектуса закинуть в табличку. Это делается с помощью формулы в ячейке.

Сделать проект с сотней переменных, откопипастить формулу на 100 ячеек и построить по ним график - это дело 30 минут с пивком и чипсами. :)

vladun
02.03.2009, 18:35
т.е. делать сдвиговые регистры в лоджике, потом создавать 100 переменных, так ?
Это не тот путь (хотя я его держал на запас), нужен путь с ОДНОЙ переменной в лоджике и одним тегом в ОРС, а также с ОДНОЙ формулой в Экселе, просто макрос экселя должен "забивать" таблицу построчно, желательно, чтобы кол-во строк можно было изменять...
Придется поискать гуру Экселя, хотя "подозревается" мне (с), что Вам, Уважаемый, это по плечу ! ;)
Спасибо всем учатстникам за уделенное время.

LordN
02.03.2009, 21:40
а орс может просто тупо в лог-файл писать? если - ну и пусть заполняет лог, а уж икселем из лога взять совсем несложно.. эт даж я могу.. наверно :)

vladun
03.03.2009, 00:26
Тоже мысля, надо проверить, сенькс

Arsie
03.03.2009, 10:23
Дык табличка из примера с журналом так и делает... Или вам нужен не пример, а готовое решение?

vladun
03.03.2009, 22:31
Делает "как" ? Вот в чем вопрос (с).
Почем я знаю как там в ВБА оно происходит ?

Arsie
04.03.2009, 10:04
Дык посмотреть! На что ещё примеры существуют?

Тем более, что приём переменной это формула, а не жуткая программа на ВБА.

vladun
04.03.2009, 14:30
можно фрагмент увидеть ? Ибо я попытался посмотреть два макроса, что входят в эксель-файл - нифига не нашел алгоритмя "забивания" таблицы построчно.
И еще, мне бы нужно, чтоб данные шли непрерывно, запускаемые, например, по кнопке, а не разовые чтения.

Arsie
04.03.2009, 15:13
Дык там по кнопке. Непрерывно. Есть только ограничение на количество "непрерывности".

Таблица заполняется по нажатию кнопки, в свойствах кнопки указан выполняющийся макрос. Он вызывает функцию FillTable. Она страшна на вид только из-за того, что фиксирует ошибки передачи и выводит их на экран. Плюс обеспечивает синхронизацию между переменными, т.к. одна строка состоит из нескольких переменных.

Суть функции в тупом копировании нескольких ячеек в таблицу с изменением номера строки. Т.е. построение "текстового тренда". Данные меняются в исходных ячейках самостоятельно.


Private Sub FillTable()

Dim f As Integer
Dim TimeOut As Integer
Dim PauseTime, Start

TimeOut = 0

Worksheets("Àâàðèè").Cells(6, 3).Value = Worksheets("Àâàðèè").Cells(110, 3).Value

' î÷èñòêà òàáëèöû æóðíàëà
ClearTable (99)

Worksheets("Àâàðèè").Cells(6, 3).Value = Worksheets("Àâàðèè").Cells(111, 3).Value

f = 0
If (Worksheets("Àâàðèè").Range("G24").Value = CBool(1)) Then GoTo norespons
If (Worksheets("Àâàðèè").Range("H24").Value = CBool(1)) Then GoTo noserver

mychannelwr = DDEInitiate("SERVOPC", "Request3")

Set wr = Worksheets("Àâàðèè").Cells(50 + 6, 2)
If (Worksheets("Àâàðèè").Range("G24").Value = CBool(1)) Then GoTo norespons
If (Worksheets("Àâàðèè").Range("H24").Value = CBool(1)) Then GoTo noserver
Call DDEPoke(mychannelwr, "ARC_IN0", wr)
PauseTime = 5
Start = Timer ' Set start time.
Do While Timer < (Start + PauseTime)
DoEvents ' Yield to other processes.
Loop

For f = 0 To Worksheets("Àâàðèè").Range("H11").Value - 1

Worksheets("Àâàðèè").Cells(f + 6, 3).Value = Worksheets("Àâàðèè").Cells(114, 3).Value
If (Worksheets("Àâàðèè").Range("G24").Value = CBool(1)) Then GoTo norespons
If (Worksheets("Àâàðèè").Range("H24").Value = CBool(1)) Then GoTo noserver

Set wr = Worksheets("Àâàðèè").Cells(f + 6, 2)

CB1Cloop:

DoEvents
If (Worksheets("Àâàðèè").Range("G24").Value = CBool(1)) Then GoTo norespons
If (Worksheets("Àâàðèè").Range("H24").Value = CBool(1)) Then GoTo noserver
Call DDEPoke(mychannelwr, "ARC_IN0", wr)
DoEvents

PauseTime = 1
Start = Timer ' Set start time.
Do While Timer < (Start + PauseTime)
DoEvents ' Yield to other processes.
Loop

TimeOut = TimeOut + 1

If (TimeOut > 30) Then Exit For

If (Worksheets("Àâàðèè").Range("G24").Value = CBool(1)) Then GoTo norespons
If (Worksheets("Àâàðèè").Range("H24").Value = CBool(1)) Then GoTo noserver

If (Worksheets("Àâàðèè").Range("H8").Value <> 1) Then GoTo CB1Cloop
If (Worksheets("Àâàðèè").Range("H10").Value <> 1) Then GoTo CB1Cloop
If (Worksheets("Àâàðèè").Range("G6").Value <> Worksheets("Àâàðèè").Cells(f + 6, 2).Value) Then GoTo CB1Cloop
TimeOut = 0
If (Worksheets("Àâàðèè").Range("G8").Value = 0) Then Exit For

Worksheets("Àâàðèè").Cells(f + 6, 3).Value = Worksheets("Àâàðèè").Cells(109, 3).Value

'ïðîâåðêà íà äîïóñòèìîñòü äàííûõ
If (Worksheets("Àâàðèè").Range("G8").Value < 0) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G8").Value > 40) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G9").Value < 0) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G9").Value > 3000) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G10").Value < 0) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G10").Value > 3000) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G11").Value < 0) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G11").Value > 3000) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G12").Value < 0) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G12").Value > 3000) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G13").Value < 0) Then GoTo SkipWrite
If (Worksheets("Àâàðèè").Range("G13").Value > 3000) Then GoTo SkipWrite

Worksheets("Àâàðèè").Cells(f + 6, 3).Value = Worksheets("Àâàðèè").Cells(Worksheets("Àâàðèè").Range("G8").Value + 120, 3).Value
Worksheets("Àâàðèè").Cells(f + 6, 4).Value = TimeSerial(Worksheets("Àâàðèè").Range("G9").Value, Worksheets("Àâàðèè").Range("G10").Value, 0)
Worksheets("Àâàðèè").Cells(f + 6, 5).Value = DateSerial(Worksheets("Àâàðèè").Range("G13").Value, Worksheets("Àâàðèè").Range("G12").Value, Worksheets("Àâàðèè").Range("G11").Value)

SkipWrite:

Next f

Worksheets("Àâàðèè").Cells(9, 8).Value = f 'çàïîìèíàåì äîêóäà çàïîëíåíî

If (Worksheets("Àâàðèè").Range("G24").Value = CBool(1)) Then GoTo norespons
If (Worksheets("Àâàðèè").Range("H24").Value = CBool(1)) Then GoTo noserver
DDETerminate mychannelwr

If (TimeOut > 30) Then Worksheets("Àâàðèè").Cells(f + 6, 3).Value = Worksheets("Àâàðèè").Cells(112, 3).Value
If (TimeOut < 30) Then Worksheets("Àâàðèè").Cells(f + 6, 3).Value = Worksheets("Àâàðèè").Cells(113, 3).Value

GoTo endsub

norespons:

Worksheets("Àâàðèè").Cells(f + 6, 3).Value = Worksheets("Àâàðèè").Cells(115, 3).Value
GoTo endsub

noserver:

Worksheets("Àâàðèè").Cells(f + 6, 3).Value = Worksheets("Àâàðèè").Cells(116, 3).Value

endsub:

End Sub

vladun
06.03.2009, 14:42
вот и пообщались ;(

Arsie
06.03.2009, 17:36
Дык "Суть функции в тупом копировании нескольких ячеек в таблицу с изменением номера строки. Т.е. построение "текстового тренда". Данные меняются в исходных ячейках самостоятельно" (c)

lexuslll
21.10.2011, 17:41
В проекте понадобилось управление заслонками последовательно, одна открывается, за ней вторая. Раскритикуйте плиз.

Sergey Cherevko
21.10.2011, 17:54
В проекте понадобилось управление заслонками последовательно, одна открывается, за ней вторая. Раскритикуйте плиз.
Имхо можно оптимизировать, будет гораздо меньше 12 блоков...

SSeVa
21.10.2011, 18:06
хоть и не понимаю всей задачи до конца, но как минимум можно заменить деление на 50 и последующее умножение на 100 простым умножением на 2 ;)

lexuslll
21.10.2011, 18:19
Это я сначала для наглядности в 0-10 V преобразовывал, а потом забыл упростить.
Задача-использовать 1 регулятор для большой заслонки, разделенной на 2 части для более точной регулировке в начале открытия.

Sergey Cherevko
21.10.2011, 18:32
Вот так гораздо проще и компактнее ;)

lexuslll
21.10.2011, 18:46
хммм.... Только сократил до 8 блоков а тут вона чё. Спасибо, и ведь считает также :D

ViS
22.10.2011, 01:09
или можно до 4-х блоков ;)

Sergey Cherevko
22.10.2011, 19:24
Однако в этом варианте входной и выходной диапазоны будут вовсе не 15...1015 :rolleyes:

ViS
22.10.2011, 20:38
так ничего не мешает задать нужный диапазон :)

Sergey Cherevko
23.10.2011, 11:09
Ага. Но для смещения до min=15 потребуется пятый FBD ;)

ntes_f
01.07.2012, 10:02
Здравствуйте! Есть у кого нибудь макрос управления кнопкой Пуск/Стоп без фиксации т.е один раз нажал Пуск второй раз нажал Стоп и.т.д. Или подскажите из каких блоков его можно собрать

alex
01.07.2012, 12:07
Здравствуйте! Есть у кого нибудь макрос управления кнопкой Пуск/Стоп без фиксации т.е один раз нажал Пуск второй раз нажал Стоп и.т.д. Или подскажите из каких блоков его можно собрать
В конструкторе F2 так и работает

ntes_f
01.07.2012, 14:03
т.е. меняеш F2 на DIN

alex
01.07.2012, 14:41
т.е. меняеш F2 на DIN
да и фильтр не забудь

ntes_f
01.07.2012, 15:55
Спасибо!

Sergey Cherevko
18.07.2012, 11:53
Макрос для индикации текущих активных событий.
Перебирает последовательно биты в слове с заданным периодом и если бит установлен, то выдает его номер + 1 на вход sel SCREENа. Если ни одного бита нет, то sel = 0 (пустая строка).

Arsie
18.07.2012, 13:58
Макрос для индикации текущих активных событий.
Перебирает последовательно биты в слове с заданным периодом и если бит установлен, то выдает его номер + 1 на вход sel SCREENа. Если ни одного бита нет, то sel = 0 (пустая строка).

В экране Конструктора вентиляции есть макрос с аналогичной функцией :)

Sergey Cherevko
18.07.2012, 18:19
Я имею ввиду макрос экрана, т.е. "Основной экран". Внутри него есть, режимы работы показывает.
Из более-менее похожих есть только "DC bus serial", но он показыает только одно сообщение для бита с максимальным номером. :scratch_o
А у меня поочередно все сообщения. :169:

Sergey Cherevko
18.07.2012, 19:20
Вот такого макроса точно нет в Конструкторе :biggrin:
Простенький пример использования макроса в прицепе.
Шаги не обязательно должны быть последовательными: можно делать ветвления, циклы, параллельное выполнение и т.д.
Короче, пользуйтесь на здоровье...

WhiteM
23.07.2013, 16:58
Попытка сделать журнал для пульта управления.
Идея: Есть приточки на SMH 2010 и пульт на SMH 2010. Они большие, чёрные, с кнопками и нравятся заказчику :)
Основная мысль: Пульт должен максимально возможно повторять экраны приточки (для заказчика проще).

В приточке немного перепиленый журнал 2.20.
В пульте останки от журнала 2.20 (выкинута память и иже с ней для упрощения синхронизации).
Журнал в пульте читает события из журнала в приточке.

Есть непонятка насчёт ресурса памяти, но в интернете нашёл, что влияет только запись, чтение на памяти не отражается (или отражается несущественно). Хотелось бы услышать мнения на этот счёт у местных Отцов-корифеев :)

Во вложении два проекта :
testПрит - журнал приточки и карта памяти
testПульт - журнал пульта

Arsie
23.07.2013, 17:24
Идея: Есть приточки на SMH 2010 и пульт на SMH 2010. Они большие, чёрные, с кнопками и нравятся заказчику :)

Основная мысль: Пульт должен максимально возможно повторять экраны приточки (для заказчика проще).

Решение уже давно есть. Экран SMH2010 транслируется в системную страницу.

Остаётся только передать нажатия кнопок в подчинённый контроллер и сделать арбитраж локального/пультового управления. Либо не делать его :) Не думаю, что одновременно будут пользоваться обоими контроллерами.

Ну и отбалансировать производительность, ибо пульт может пригрузить основной контроллер на 20 мсек запросто, а при больной голове и на все 50 мсек.

Выделил решение в отдельную тему: http://forum.segnetics.com/showthread.php?p=16634#post16634




Есть непонятка насчёт ресурса памяти, но в интернете нашёл, что влияет только запись, чтение на памяти не отражается (или отражается несущественно). Хотелось бы услышать мнения на этот счёт у местных Отцов-корифеев :)


Да, чтение не влияет.

WhiteM
23.07.2013, 17:52
Решение уже давно есть. Экран SMH2010 транслируется в системную страницу.
. . .
Выделил решение в отдельную тему: http://forum.segnetics.com/showthread.php?p=16634#post16634


:newconfus От шайтан! :icq_no_wo Не знал, спасибо. Буду много думать. Смущает количество сетевых переменных... Попробую и так и так :)

Arsie
23.07.2013, 18:06
:newconfus От шайтан! :icq_no_wo Не знал, спасибо. Буду много думать. Смущает количество сетевых переменных... Попробую и так и так :)

Всего один запрос. Т.е. это менее ресурсоёмко вашего решения.

А количество блоков представляет собой скорее академический интерес, т.к. контроллер выполняет их менее, чем за 15 мсек при предельных в такой задаче 70-80 мсек.

WhiteM
23.07.2013, 18:23
Ммм... Разобрался. Вкусняжка!
А с пикселями и другими контроллерами работать будет?

Arsie
23.07.2013, 18:53
Ммм... Разобрался. Вкусняжка!
А с пикселями и другими контроллерами работать будет?

Не со всеми.

SMH2010 работает только с SMH2010 из-за особенностей кодировки.

А вот Пиксели и SMH-2G вполне смогут перекреститься.

SMH-2Gi как слейв пролетает мимо, может быть только пультом для Пикселя/SMH-2G, да и то, проверить нужно что там с кодировками.

Если использовать английский, то требования расслабляются.