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 можно описать так:
  1. Набор допустимых символов: 'a'..'z', '0'..'9', '.', '_',' ', Tab,'+', '-', '*', '/', '%', '^', '(', ')', ',', '=',':', ';', '$'.
  2. Поддерживается один тип данных-число (double). Массивы и строки не предусмотрены. Поддерживаются переменные, константы, встроенные функции, арифметические операторы, скобки любого уровня, метки, условный оператор if..then.., оператор перехода на метку goto, вызова подпрограммы gosub.
  3. Программа DaqScript состоит из последовательно выполняемых строк вида
    Метка: Оператор ;Комментарий
    Наличие метки, комментария и оператора в строке необязательно. (То есть могут быть разные комбинации). На одной строке может быть только один оператор.
  4. Признаком начала комментария является символ ';'. Комментарий при выполнении игнорируется.
  5. Признаком метки является символ ':', причем пробелов между именем метки и ':' быть не должно. Имя метки состоит из символов 'a'..'z', '0'..'9', '_' , но первой должна быть буква или '_'. Двух одинаковых меток в программе быть не должно.
  6. Поддерживаются переменные. Имя переменной состоит из символов 'a'..'z', '0'..'9', '_' , но первой должна быть буква или '_'. Переменные создаются автоматически при непустом присвоении типа
    ИмяПеременной=Выражение
    Переменные удаляются автоматически при пустом присвоении типа
    ИмяПеременной=
    Переменные могут быть объявлены в конструкции
    var Имя1,Имя2...
    Конструкция var создает указанные переменные со значением 0, если они не существовали, но не меняет значений уже существующих переменных.
  7. Условный оператор имеет вид
    if (Условие) then Оператор или
    if Условие then Оператор
    Если выражение Условие имеет значение 0, то Оператор игнорируется. Если выражение Условие не равно 0, то Оператор выполняется.
    Оператор может быть выражением или переходом на метку, но не другим оператором if.
  8. Оператор перехода на метку имеет вид
    goto ИмяМетки
    Интерпретатор найдет строку с меткой ИмяМетки: и передаст управление этой строке.
  9. Выражения могут содержать операторы +,-,*,/,%,^,скобки,ссылки на переменные, константы, вызовы функций - все как обычно.
  10. Функции различаются наличием после имени скобок с параметрами, разделенными запятыми с числом параметров от 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()


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)

Пример:
Задать последней точке кривой значения 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

Число входов и выходов устройства определяется его типом. Устройства - драйверы конкретного оборудования обычно имеют фиксированное число входов-выходов, которое определяется этим оборудованием. Например, устройство ADAM-7017 имеет 8 аналоговых выходов (значения АЦП). Программные устройства могут иметь различное число входов-выходов, в зависисмости от их конфигурации. Число аналоговых/цифровых входов/выходов задается для скриптовых устройств переменными AnalogInputs, DigitalInputs, AnalogOutputs, DigitalOutputs в секции описания устройства.
DaqScriptApi -> refai refdi refao refdo

refai(n)
refdi(n)
refao(n)
refdo(n)


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)


DaqScriptApi -> putev putao putdo

putev(w,c,t,d0,d1)
putao(n,t,d)
putdo(n,t,d)


DaqScriptApi -> numcals refcalibr calibr

numcals
refcalibr(n)
calibr(n,d,p)


DaqScriptApi -> fixerror

fixerror(n)


DaqScriptApi -> inportb inportw outportb outportw

inportb(n)
inportw(n)
outportb(n,d)
outportw(n,d)


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)


DaqScriptApi -> igettag rgettag isettag rsettag typetag

igettag(a)
rgettag(a)
isettag(a,b)
rsettag(a,b)
typetag(a)


DaqScriptApi -> clicktag clickbutton

clicktag()
clickbutton()


DaqScriptApi -> deg rad

deg(x)
rad(x)


DaqScriptApi -> sin cos tan

sin(x)
cos(x)
tan(x)


DaqScriptApi -> asin acos atan

asin(x)
acos(x)
atan(x)


DaqScriptApi -> sinh cosh tanh

sinh(x)
cosh(x)
tanh(x)


DaqScriptApi -> exp

exp(x)


DaqScriptApi -> ln log

ln(x)
log(n,x)


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)


DaqScriptApi -> hypot

hypot(x,y)


DaqScriptApi -> rand random

rand()
random(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)


DaqScriptApi -> msecnow secnow getticks

msecnow()
secnow()
getticks()


DaqScriptApi -> or xor and not

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)


DaqScriptApi -> getbitmask isbit

getbitmask(n)
isbit(x,n)


DaqScriptApi -> gamma

gamma(n)


DaqScriptApi -> isnan isinf

isnan(a)
isinf(a)


DaqScriptApi -> vnew vfree vsize vget vput

vnew(a)
vfree(a)
vsize(a)
vget(a,b)
vput(a,b,c)


DaqScriptApi -> @inittag @findtag

@inittag
@findtag


DaqScriptApi -> @clicksensor

@clicksensor


DaqScriptApi -> @echo

@echo


DaqScriptApi -> @voice

@voice arg


DaqScriptApi -> @action

@action arg


DaqScriptApi -> @clear @cleardevice

@clear arg
@cleardevice arg


DaqScriptApi -> @start @stop

@start arg
@stop arg


DaqScriptApi -> @devmsg @devsend @devpost @devsendmsg @devpostmsg

@devmsg dev msg
@devsend dev msg
@devpost dev msg
@devsendmsg dev msg
@devpostmsg dev msg

Посылка сообщения с синхронизацией (пробуждением устройства-приемника) может ускорить обработку посылаемого сообщения, так как при синхронизации (точнее пробуждении) устройства-приемника оно может быстрее приступить к его обработке, ведь при пробуждении устройства его поток "просыпается" и может приступать к обработке, не дожидаясь своего кванта времени. Однако при этом может существенно увеличиваться частота переключения потоков, что увеличивает нагрузку на процессор. Используйте посылку с синхронизацией для ускорения обработки, без синхронизации - для снижения нагрузки.
DaqScriptApi -> @debugout

@debugout msg


DaqScriptApi -> @clearcurve

@clearcurve arg


DaqScriptApi -> @savecrw

@savecrw fname winname wintitle winlable curvelist


DaqScriptApi -> @specmarker @specmarkerl @specmarkerr @specroil @specroir

@specmarker win
@specmarkerl win
@specmarkerr win
@specroil win
@specroir win


DaqScriptApi -> @windraw @winshow @winhide @winselect

@windraw win
@winshow win
@winhide win
@winselect win


DaqScriptApi -> @global

@global expr


DaqScriptApi -> @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