DAQ SCRIPT API
Содержание
- Введение
- Устройство ScriptDevice
- Синтаксис DaqScript
- Конструкции DaqScript
- Комментарии
- Метки
- Переменные
- Константы
- Операторы
- Директивы
- Функции и директивы DaqScript
- Функции DAQ:
time
timeunits
crvlen
crvx
crvy
crvput
crvinteg
numais
numdis
numaos
numdos
numcals
refai
refdi
refao
refdo
refcalibr
getai
getai_n
getai_xn
getai_yn
getai_xi
getai_yi
getdi
getdi_n
getdi_xn
getdi_yn
getdi_xi
getdi_yi
putev
putao
putdo
calibr
fixerror
inportb
inportw
outportb
outportw
tm_new
tm_free
tm_addint
tm_numint
tm_getint
tm_setint
tm_gettime
tm_start
tm_stop
tm_isstart
tm_event
tm_curint
igettag
rgettag
isettag
rsettag
typetag
clicktag
clickbutton
- Общие функции:
deg
rad
sin
cos
tan
asin
acos
atan
sinh
cosh
tanh
exp
ln
log
sqrt
int
trunc
frac
round
floor
ceil
abs
hypot
rand
random
sign
eq
ne
lt
gt
le
ge
max
min
msecnow
secnow
getticks
or
xor
and
not
bitor
bitxor
bitand
bitnot
getbitmask
isbit
gamma
isnan
isinf
vnew
vfree
vsize
vget
vput
- Директивы:
@inittag
@findtag
@clicksensor
@echo
@voice
@action
@clear
@cleardevice
@start
@stop
@devmsg
@devsend
@devpost
@devsendmsg
@devpostmsg
@debugout
@clearcurve
@savecrw
@specmarker
@specmarkerl
@specmarkerr
@specroil
@specroir
@windraw
@winshow
@winhide
@winselect
@global
@async
@system
- Конфигурация
- Конфигурация ScriptDevice
DaqScriptApi ->
Устройство ScriptDevice
Устройство ScriptDevice
Устройство
ScriptDevice с именем
name объявляется в файле конфигурации как
[DeviceList]
name = Device Software Script
Устройство служит для общей обработки данных при помощи встроенного интерпретатора.
Число входов, выходов и калибровок задается в конфигурационном файле.
Устройство содержит простой интерпретатор для выполнения программ (скриптов) на
языке условно названном
"DaqScript". Это узкоориентированный интерпретатор
для встраивания в устройства
DAQ и проведения простых вычислений в процессе
измерений.
Интерпретатор
DaqScript содержит функции для чтения данных со входов устройства,
записи результата на выходы, доступа к калибровкам а также обработки данных.
DaqScriptApi ->
Синтаксис DaqScript
Синтаксис DaqScript
В настоящее время синтаксис
DaqScript можно описать так:
- Набор допустимых символов:
'a'..'z', '0'..'9', '.', '_',' ', Tab,'+', '-', '*', '/', '%', '^', '(', ')', ',', '=',':', ';', '$'.
- Поддерживается один тип данных-число (double). Массивы и строки не предусмотрены.
Поддерживаются переменные, константы, встроенные функции, арифметические операторы,
скобки любого уровня, метки, условный оператор if..then.., оператор перехода на метку goto,
вызова подпрограммы gosub.
- Программа DaqScript состоит из последовательно выполняемых строк вида
Метка: Оператор ;Комментарий
Наличие метки, комментария и оператора в строке необязательно.
(То есть могут быть разные комбинации).
На одной строке может быть только один оператор.
- Признаком начала комментария является символ ';'.
Комментарий при выполнении игнорируется.
- Признаком метки является символ ':', причем пробелов между именем метки и ':'
быть не должно. Имя метки состоит из символов 'a'..'z', '0'..'9', '_' ,
но первой должна быть буква или '_'. Двух одинаковых меток в программе быть
не должно.
- Поддерживаются переменные. Имя переменной состоит из символов
'a'..'z', '0'..'9', '_' , но первой должна быть буква или '_'.
Переменные создаются автоматически при непустом присвоении типа
ИмяПеременной=Выражение
Переменные удаляются автоматически при пустом присвоении типа
ИмяПеременной=
Переменные могут быть объявлены в конструкции
var Имя1,Имя2...
Конструкция var создает указанные переменные со значением 0, если они не
существовали, но не меняет значений уже существующих переменных.
- Условный оператор имеет вид
if (Условие) then Оператор или
if Условие then Оператор
Если выражение Условие имеет значение 0, то Оператор игнорируется.
Если выражение Условие не равно 0, то Оператор выполняется.
Оператор может быть выражением или переходом на метку, но не другим
оператором if.
- Оператор перехода на метку имеет вид
goto ИмяМетки
Интерпретатор найдет строку с меткой ИмяМетки: и передаст управление этой строке.
- Выражения могут содержать операторы +,-,*,/,%,^,скобки,ссылки на переменные,
константы, вызовы функций - все как обычно.
- Функции различаются наличием после имени скобок с параметрами, разделенными
запятыми с числом параметров от 0 до 7, например,
time()
hypot(x,y)
DaqScriptApi ->
комментарии
метки
переменные
константы
операторы
директивы
Конструкции DaqScript
Комментарии отделяются символом ';'.
Комментарий при выполнении игнорируется.
Label: - имя метки и сразу за ней символ ':'.
Переменные создаются автоматически при непустом присвоении (x=10)
и удаляются атоматически при пустом присвоении (x= ).
Константы:
pi = 3.14159265358979 - число π
e = 2.71828182845905 - основание натурального логарифма
macheps = 2.22044604925031E-16 - машинная точность
false = 0 - логический ноль
true = 1 - логическая единица
_nan = NAN - нечисловое значение
_inf = INF - плюс бесконечность
_minusinf = -INF - минус бесконечность
minshortint = -128 - минимальное значение shortint
maxshortint = 127 - максимальное значение shortint
maxbyte = 255 - максимальное значение byte
minsmallint = -32768 - минимальное значение smallint
maxsmallint = 32767 - максимальное значение smallint
maxword = 65535 - максимальное значение word
minlongint = -2147483648 - минимальное значение longint
maxlongint = 2147483647 - максимальное значение longint
minint = -2147483648 - минимальное значение int
maxint = 2147483647 - максимальное значение int
maxdword = 4294967295 - максимальное значение DWORD
maxlongword = 4294967295 - максимальное значение longword
minsingle = 1.5E-45 - минимальное значение single положительное отличное от нуля
maxsingle = 3.4E38 - максимальное значение single
mindouble = 4.94065645841247E-324 - минимальное значение double положительное отличное от нуля
maxdouble = 1.7E308 - максимальное значение double
Операторы:
goto Label Передает управление по метке Label:
gosub Label Вызывает подпрограмму по метке Label:
return Возврат из подпрограммы, вызванной gosub
if c then O Условное выполнение оператора O при условии, что выражение c отлично от нуля
+ Сумма
- Разность
* Умножение
/ Деление
% Остаток
^ Возведение в степень
Директивы принимают строку как аргумент и
делают ее разбор специальным образом.
Например:
@voice hello
В директивах возможна передача значений переменных: если встречается конструкция
%name,
то она заменяется значением переменной
name.
Перед
%name можно указать формат, например,
%7.3f%name подставляет
значение
name в формате
%7.3f.
Например:
@echo pi=%7.5f%pi
выведет
pi=3.14159
DaqScriptApi ->
time
timeunits
function time()
function timeunits()
- time возвращает текущее время по часам DAQ-системы
в единицах timeunits с начала измерений
- timeunits возвращает величину единицы времени DAQ-системы
в миллисекундах
DaqScriptApi ->
crvlen
crvx
crvy
crvput
crvinteg
function crvlen(c)
function crvx(c,i)
function crvy(c,i)
function crvput(c,i,x,y)
function crvinteg(c,a,b)
- crvlen(c) возвращает длину, то есть число точек, кривой со ссылкой c
- crvx(c,i) возвращает координату x кривой c в точке номер i
- crvy(c,i) возвращает координату y кривой c в точке номер i
- crvput(c,i,x,y) поместить в кривую c в точке номер i данные x,y
- crvinteg(c,a,b) возвращает интеграл кривой c в интервале a..b
Пример:
Задать последней точке кривой значения x,y
c:=refao(0);
b:=crvput(c,crvlen(c),x,y);
DaqScriptApi ->
numais
numdis
numaos
numdos
function numais()
function numdis()
function numaos
function numdos
- numais() - Number of Analog Inputs, число аналоговых входов.
- numdis() - Number of Digital Inputs, число цифровых входов.
- numaos - Number of Analog Outputs, число аналоговых выходов.
- numdos - Number of Digital Outputs, число цифровых выходов.
Число входов и выходов устройства определяется его типом.
Устройства - драйверы конкретного оборудования обычно имеют фиксированное число входов-выходов,
которое определяется этим оборудованием.
Например, устройство
ADAM-7017 имеет
8 аналоговых выходов (значения
АЦП).
Программные устройства могут иметь различное число входов-выходов, в зависисмости от их конфигурации.
Число аналоговых/цифровых входов/выходов задается для скриптовых устройств переменными
AnalogInputs,
DigitalInputs,
AnalogOutputs,
DigitalOutputs
в секции описания устройства.
DaqScriptApi ->
refai
refdi
refao
refdo
refai(n)
refdi(n)
refao(n)
refdo(n)
- refai(n) ссылка на аналоговый вход n или 0 если его нет
- refdi(n) ссылка на цифровой вход n или 0 если его нет
- refao(n) ссылка на аналоговый выход n или 0 если его нет
- refdo(n) ссылка на цифровой выход n или 0 если его нет
DaqScriptApi ->
getai
getai_n
getai_xn
getai_yn
getai_xi
getai_yi
getdi
getdi_n
getdi_xn
getdi_yn
getdi_xi
getdi_yi
getai(n,t)
getai_n(n)
getai_xn(n)
getai_yn(n)
getai_xi(n,i)
getai_yi(n,i)
getdi(n,t)
getdi_n(n)
getdi_xn(n)
getdi_yn(n)
getdi_xi(n,i)
getdi_yi(n,i)
- getai(n,t) аналоговый вход номер n в момент времени t
- getai_n(n) число точек,аналоговый вход номер n
- getai_xn(n) x последней точки,аналоговый вход номер n
- getai_yn(n) y последней точки,аналоговый вход номер n
- getai_xi(n,i) x точки номер i,аналоговый вход номер n
- getai_yi(n,i) y точки номер i,аналоговый вход номер n
- getdi(n,t) цифровой вход номер n в момент времени t
- getdi_n(n) число точек,цифровой вход номер n
- getdi_xn(n) x последней точки,цифровой вход номер n
- getdi_yn(n) y последней точки,цифровой вход номер n
- getdi_xi(n,i) x точки номер i,цифровой вход номер n
- getdi_yi(n,i) y точки номер i,цифровой вход номер n
DaqScriptApi ->
putev
putao
putdo
putev(w,c,t,d0,d1)
putao(n,t,d)
putdo(n,t,d)
- putev(w,c,t,d0,d1) генерирует событие:(what,chan,time,data0,data1);
возвращает 1 при успехе
- putao(n,t,d) генерирует аналоговое событие с номером канала n,
временем t и данными d; возвращает 1 при успехе
- putdo(n,t,d) генерирует цифровое событие с номером канала n,
временем t и данными d; возвращает 1 при успехе
DaqScriptApi ->
numcals
refcalibr
calibr
numcals
refcalibr(n)
calibr(n,d,p)
- numcals число калибровок
- refcalibr(n) ссылка на калибровку n или 0 если ее нет
- calibr(n,d,p) возвращает результат калибровочного преобразования;
n-номер калибровки,d-данные, p-параметр
DaqScriptApi ->
fixerror
fixerror(n)
- fixerror(n) регистрирует ошибку номер n
DaqScriptApi ->
inportb
inportw
outportb
outportw
inportb(n)
inportw(n)
outportb(n,d)
outportw(n,d)
- inportb(n) ввод байта из порта ввода-вывода n
- inportw(n) ввод слова из порта ввода-вывода n
- outportb(n,d) вывод байта d в порт ввода-вывода n
- outportw(n,d) вывод слова d в порт ввода-вывода n
DaqScriptApi ->
tm_new
tm_free
tm_addint
tm_numint
tm_getint
tm_setint
tm_gettime
tm_start
tm_stop
tm_isstart
tm_event
tm_curint
tm_new()
tm_free(a)
tm_addint(a,b)
tm_numint(a)
tm_getint(a,b)
tm_setint(a,b,c)
tm_gettime(a)
tm_start(a)
tm_stop(a)
tm_isstart(a)
tm_event(a)
tm_curint(a)
- tm_new() создать новый таймер
- tm_free(a) удалить таймер a
- tm_addint(a,b) добавить в таймер a новый интервал b,[ms]
- tm_numint(a) узнать число интервалов таймера a
- tm_getint(a,b) узнать длину интервала номер b таймера a,[ms]
- tm_setint(a,b,c) задать длину c,[ms] интервала номер b таймера a
- tm_gettime(a) узнать время со старта таймера a, [ms]
- tm_start(a) пуск таймера a
- tm_stop(a) останов таймера a
- tm_isstart(a) узнать запущен ли таймер a
- tm_event(a) генерация событий таймера a
- tm_curint(a) номер текущего интервала таймера a
DaqScriptApi ->
igettag
rgettag
isettag
rsettag
typetag
igettag(a)
rgettag(a)
isettag(a,b)
rsettag(a,b)
typetag(a)
- igettag(a) чтение значения integer тега a
- rgettag(a) чтение значения real тега a
- isettag(a,b) запись в integer тег a значения b
- rsettag(a,b) запись в integer тег a значения b
- typetag(a) возвращает тип тега a, 1/2/3=integer/real/string
DaqScriptApi ->
clicktag
clickbutton
clicktag()
clickbutton()
- clicktag() возвращает тег нажатого сенсора или 0
- clickbutton() возвращает нажатую кнопку мыши 1/2/4=Left/Right/Middle
DaqScriptApi ->
deg
rad
deg(x)
rad(x)
- deg(x) перевод радиан в градусы
- rad(x) перевод градус в радианы
DaqScriptApi ->
sin
cos
tan
sin(x)
cos(x)
tan(x)
- sin(x) синус
- cos(x) косинус
- tan(x) тангенс
DaqScriptApi ->
asin
acos
atan
asin(x)
acos(x)
atan(x)
- asin(x) обратный синус
- acos(x) обратный косинус
- atan(x) обратный тангенс
DaqScriptApi ->
sinh
cosh
tanh
sinh(x)
cosh(x)
tanh(x)
- sinh(x) гиперболический синус
- cosh(x) гиперболический косинус
- tanh(x) гиперболический тангенс
DaqScriptApi ->
exp
exp(x)
DaqScriptApi ->
ln
log
ln(x)
log(n,x)
- ln(x) натуральный логарифм x
- log(n,x) логарифм x по основанию n
DaqScriptApi ->
sqrt
sqrt(x)
DaqScriptApi ->
int
trunc
frac
round
floor
ceil
abs
int(x)
trunc(x)
frac(x)
round(x)
floor(x)
ceil(x)
abs(x)
- int(x) округление в сторону нуля
- trunc(x) округление в сторону нуля
- frac(x) дробная часть
- round(x) округление в сторону ближайшего целого
- floor(x) округление в сторону нуля
- ceil(x) округление в сторону INF
- abs(x) модуль
DaqScriptApi ->
hypot
hypot(x,y)
DaqScriptApi ->
rand
random
rand()
random(a,b)
- rand() случайное число от 0 до 1
- random(a,b) случайное число в интервале (a,b)
DaqScriptApi ->
sign
sign(x)
DaqScriptApi ->
eq
ne
lt
gt
le
ge
max
min
eq(x,y)
ne(x,y)
lt(x,y)
gt(x,y)
le(x,y)
ge(x,y)
max(x,y)
min(x,y)
- eq(x,y) равно 1/0 если x=y
- ne(x,y) равно 1/0 если x<>y
- lt(x,y) равно 1/0 если x<y
- gt(x,y) равно 1/0 если x>y
- le(x,y) равно 1/0 если x<=y
- ge(x,y) равно 1/0 если x>=y
- max(x,y) максимальное из x и y
- min(x,y) минимальное из x и y
DaqScriptApi ->
msecnow
secnow
getticks
msecnow()
secnow()
getticks()
- msecnow() текущее время в миллисекундах от Рождества Христова
- secnow() текущее время в секундах от Рождества Христова
- getticks() текущее время в тиках таймера BIOS
DaqScriptApi ->
or
xor
and
not
or(x,y)
xor(x,y)
and(x,y)
not(x)
- or(x,y) логическое неисключающее или
- xor(x,y) логическое исключающее или
- and(x,y) логическое и
- not(x) логическое отрицание
DaqScriptApi ->
bitor
bitxor
bitand
bitnot
bitor(x,y)
bitxor(x,y)
bitand(x,y)
bitnot(x)
- bitor(x,y) побитное арифметическое неисключающее или
- bitxor(x,y) побитное арифметическое исключающее или
- bitand(x,y) побитное арифметическое и
- bitnot(x) побитное арифметическое отрицание
DaqScriptApi ->
getbitmask
isbit
getbitmask(n)
isbit(x,n)
- getbitmask(n) получить 2^n - то есть бит номер n
- isbit(x,n) есть ли в x бит номер n
DaqScriptApi ->
gamma
gamma(n)
- gamma(n) гамма-функция: gamma(n) = (n-1)!
DaqScriptApi ->
isnan
isinf
isnan(a)
isinf(a)
- isnan(a) 1 если a=NAN или 0
- isinf(a) 1 если a=INF или 0
DaqScriptApi ->
vnew
vfree
vsize
vget
vput
vnew(a)
vfree(a)
vsize(a)
vget(a,b)
vput(a,b,c)
- vnew(a) создаст массив размерности a и вернет ссылку
- vfree(a) удалит созданный vnew массив заданный ссылкой a
- vsize(a) вернет размерность массива заданного ссылкой a
- vget(a,b) вернет элемент массива a с номером b
- vput(a,b,c) записать в элемент массива a номер b значение c
DaqScriptApi ->
@inittag
@findtag
@inittag
@findtag
- @inittag n t найти или создать тег с именем n и типом t=1..3
- @findtag n найти тег по имени n, результат в actiontesult
DaqScriptApi ->
@clicksensor
@clicksensor
- @clicksensor name проверяет, нажат ли сенсор с именем name
DaqScriptApi ->
@echo
@echo
- @echo вывод сообщения в консольное окно
DaqScriptApi ->
@voice
@voice arg
- @voice arg звуковое сообщение в строке arg
DaqScriptApi ->
@action
@action arg
- @action arg вызов метода action для списка устройств arg
DaqScriptApi ->
@clear
@cleardevice
@clear arg
@cleardevice arg
- @clear arg вызов метода clear для списка устройств arg
- @cleardevice arg вызов метода cleardevice для списка устройств arg
DaqScriptApi ->
@start
@stop
@start arg
@stop arg
- @start arg вызов метода start для списка устройств arg
- @stop arg вызов метода stop для списка устройств arg
DaqScriptApi ->
@devmsg
@devsend
@devpost
@devsendmsg
@devpostmsg
@devmsg dev msg
@devsend dev msg
@devpost dev msg
@devsendmsg dev msg
@devpostmsg dev msg
- @devmsg dev msg посылка сообщения msg устройству dev с сихронизацией (пробуждением устройства dev)
- @devsend dev msg посылка сообщения msg устройству dev с сихронизацией (пробуждением устройства dev)
- @devpost dev msg посылка сообщения msg устройству dev без сихронизации (пробуждения устройства dev не происходит)
- @devsendmsg dev msg посылка сообщения msg устройству dev с сихронизацией (пробуждением устройства dev)
- @devpostmsg dev msg посылка сообщения msg устройству dev без сихронизации (пробуждения устройства dev не происходит)
Посылка сообщения с синхронизацией (пробуждением устройства-приемника) может ускорить обработку посылаемого сообщения,
так как при синхронизации (точнее пробуждении) устройства-приемника оно может быстрее приступить к его обработке,
ведь при пробуждении устройства его поток "просыпается" и может приступать к обработке, не дожидаясь своего кванта времени.
Однако при этом может существенно увеличиваться частота переключения потоков, что увеличивает нагрузку на процессор.
Используйте посылку с синхронизацией для ускорения обработки, без синхронизации - для снижения нагрузки.
DaqScriptApi ->
@debugout
@debugout msg
- @debugout msg вывод сообщения msg в файл отладки
DaqScriptApi ->
@clearcurve
@clearcurve arg
- @clearcurve arg очистка кривых из списка arg
DaqScriptApi ->
@savecrw
@savecrw fname winname wintitle winlable curvelist
- @savecrw выполняет сохранение кривых в файл CRW
@savecrw fname winname wintitle winlable curvelist
fname - имя файла (можно без пути и без расширения)
winname - имя окна под которым оно попадет в crw-архив
wintitle - заголовок в верхней части окна
winlable - метка в нижней части окна
curvelist - список сохраняемых кривых
DaqScriptApi ->
@specmarker
@specmarkerl
@specmarkerr
@specroil
@specroir
@specmarker win
@specmarkerl win
@specmarkerr win
@specroil win
@specroir win
- @specmarker win выдать Marker спектрометрич. окна win
- @specmarkerl win выдать MarkerL спектрометрич. окна win
- @specmarkerr win выдать MarkerR спектрометрич. окна win
- @specroil win выдать RoiL спектрометрич. окна win
- @specroir win выдать RoiR спектрометрич. окна win
DaqScriptApi ->
@windraw
@winshow
@winhide
@winselect
@windraw win
@winshow win
@winhide win
@winselect win
- @windraw win перерисовать окно win
- @winshow win показать окно win
- @winhide win спрятать окно win
- @winselect win активизировать окно win
DaqScriptApi ->
@global
@global expr
- @global expr вычисляет выражение expr в общем калькуляторе
DaqScriptApi ->
@async
@async
- @async асинхронное выполнение команд в основном потоке программы, через задержанный
вызов системного калькулятора, связанного с основной программой
DaqScriptApi ->
@system
@system
DaqScriptApi ->
Конфигурация ScriptDevice
Конфигурация ScriptDevice
Конфигурация устройства с именем
name задается в секции
[name].
Эта секция содержит такие переменные:
AnalogInputs = n - задание числа аналоговых входов
AnalogOutputs = n - задание числа аналоговых выходов
DigitalInputs = n - задание числа цифровых входов
DigitalOutputs = n - задание числа цифровых выходов
Calibrations = n - задание числа калибровок
Calibration#n = ? - задание калибровки номер n
DebugMode = 1/0 - надо ли выводить диагностику ошибок интерпретации в файл отладки
ScriptSection = section - задание имени секции с текстом выражений
Пример конфигурации:
Данный пример генерирует сигналы на трех аналоговых выходах.
[DeviceList]
script1 = device software script
[script1]
AnalogInputs = 0
DigitalInputs = 0
AnalogOutputs = 3
DigitalOutputs = 0
Calibrations = 0
Link AnalogOutput 0 with curve ao0
Link AnalogOutput 1 with curve ao1
Link AnalogOutput 2 with curve ao2
DebugMode = 1
ScriptSection = script1.text
[script1.text]
t=time()
a0=10*sin(2*pi*t)+0.1*random(-1,1)
a1=5*cos(2*pi*t)+0.1*random(-1,1)
a2=-10*sin(2*pi*t*0.1)+0.1*random(-1,1)
putao(0,t,a0)
putao(1,t,a1)
putao(2,t,a2)
Пример выражений:
t=time() ; взять время DAQ
x=t*60 ; перевести в секунды
y=sin(2*pi*x) ; вычислить синус
putao(0,t,y,1) ; вывести на аналоговый выход 0
n=100
@voice %n