0

Написание скриптов

Александр 9 лет назад в Редактор каналов обновлен 8 лет назад 0
Подскажите где можно взять описание компилятора (в частности Basic) и перечень операторов поддерживаемых компилятором?
День добрый.

Подскажите где можно взять описание компилятора (в частности Basic) и перечень операторов поддерживаемых компилятором?

Синтаксис BasicScript

[spoiler]
Program -> Statements

Statements -> (EOL | StatementList EOL)…

StatementList -> Statement/':'…

ImportStmt -> IMPORTS (String/,)…

DimStmt -> DIM (VarDecl/',')…

VarDecl -> Ident [Array] [AsClause] [InitValue]

AsClause -> AS Ident

Array -> '[' ArrayDim/','… ']'

ArrayDim -> Expression

InitValue -> '=' Expression

Expression -> SimpleExpression [RelOp SimpleExpression]…

SimpleExpression -> ['-'] Term [AddOp Term]…

Term -> Factor [MulOp Factor]…

Factor -> Designator
-> UnsignedNumber
-> String
-> '(' Expression ')'
-> NOT Factor
-> NewOperator
-> '<' FRString '>'

SetConstructor -> SetNode/','…

SetNode -> Expression ['..' Expression]

NewOperator -> NEW Designator

RelOp -> '>'
-> '<'
-> '<='
-> '>='
-> '<>'
-> '='
-> IN
-> IS

AddOp -> '+'
-> '-'
-> '&'
-> OR
-> XOR

MulOp -> '*'
-> '/'
-> '\'
-> MOD
-> AND

Designator -> [ADDRESSOF] Ident ['.' Ident | '[' ExprList ']' | '(' [ExprList] ')']…

ExprList -> Expression/','…

Statement -> BreakStmt
-> CaseStmt
-> ContinueStmt
-> DeleteStmt
-> DimStmt
-> DoStmt
-> ExitStmt
-> ForStmt
-> FuncStmt
-> IfStmt
-> ImportStmt
-> ProcStmt
-> ReturnStmt
-> SetStmt
-> TryStmt
-> WhileStmt
-> WithStmt
-> AssignStmt
-> CallStmt

BreakStmt -> BREAK

ContinueStmt -> CONTINUE

ExitStmt -> EXIT

DeleteStmt -> DELETE Designator

SetStmt -> SET AssignStmt

AssignStmt -> Designator ['+'|'-'|'*'|'/']'=' Expression

CallStmt -> Designator ['+''+'|'-''-']

ReturnStmt -> RETURN [Expression]

IfStmt -> IF Expression THEN ThenStmt

ThenStmt -> EOL [Statements] [ElseIfStmt | ElseStmt] END IF
-> StatementList

ElseIfStmt -> ELSEIF Expression THEN
(EOL [Statements] [ElseIfStmt | ElseStmt] | Statement)

ElseStmt -> ELSE (EOL [Statements] | Statement)

CaseStmt -> SELECT CASE Expression EOL
(CaseSelector…) [CASE ELSE ':' Statements] END SELECT

CaseSelector -> CASE SetConstructor ':' Statements

DoStmt -> DO [Statements] LOOP (UNTIL | WHILE) Expression

WhileStmt -> WHILE Expression [Statements] WEND

ForStmt -> FOR Ident '=' Expression TO Expression [STEP Expression] EOL
[Statements] NEXT

TryStmt -> TRY Statements (FINALLY | CATCH) [Statements] END TRY

WithStmt -> WITH Designator EOL Statements END WITH

ProcStmt -> SUB Ident [FormalParameters] EOL [Statements] END SUB

FuncStmt -> FUNCTION Ident [FormalParameters] [AsClause] EOL
[Statements] END FUNCTION

FormalParameters -> '(' (FormalParam/',')… ')'

FormalParm -> [BYREF | BYVAL] VarList
[/spoiler]


Структура BasicScript

[spoiler]
#language BasicScript // опционально
imports "unit1.vb", "unit2.vb"
// раздел imports - должен быть перед любым другим разделом

dim i, j = 0 // раздел переменных - может быть в любом месте

function p1() // функции
{ //
}
// главная исполняемая функция.
for i = 0 to 10
p1()
next
[/spoiler]
Этот перечень я видел в документации.
Но видимо у меня не хватает знаний в нем разобраться.
Прошу указать где об этом можно более подробно узнать.
Спасибо!
Добрый вечер.


Этот перечень я видел в документации.
Но видимо у меня не хватает знаний в нем разобраться.
Прошу указать где об этом можно более подробно узнать.
Спасибо!

Прошу прощение за задержку с ответом. Опишите подробней что именно Вы хотите уточнить? Синтаксис языка Basic?
Уважаемые разработчики! Проблема в том, что, по большей части - мыжНЕпрограммисты! И работа со скадой зачастую далеко не основная обязанность. Привлекать программиста накладно, ещё надо умудриться объяснить, чего тебе надо. Ему надо умудриться правильно понять и опять же разобраться с особенностями редактора. И всё это ради десяти строчек. А в случае вылезающих в процессе косяков становится вообще непонятно, кто виноват и что исправлять. И как?

То, что выложено под спойлерами - тёмный лес, поверьте.
Хочется видеть что-то такое. Это хелп из другой скады.

BitAnd
Описание
Выполнить операцию побитового AND между Value1 и Value2

Синтаксис
int BitAnd(int Value1, int Value2)

Параметры
Value1 = первое обрабатываемое число
Value2 = второе обрабатываемое число

Возвращаемое значение
Результат операции Value1 AND Value2

Связанные функции
BitOr(), BitXor(), BitNot()

Пример

int Result;
int Value1;
int Value2;
Value1=HexStrToInt("0xFFA7");
Value2=HexStrToInt("0x0FF5");

Result=BitAnd(Value1,Value2);

В результате получится 0xFA5


Понятно, что сваять подобный хелп, да ещё с примерами на четыре языка - серьёзная работа. Но даже наличие простого списка со всеми функциями, операторами и что там ещё бывает, очень поможет. Со всеми, в том числе if… then, for… next, < > и т.д. Иначе возникает дурацкая ситуация, когда изрядно порывшись в интернете, пишешь скрипт, а он не работает, поскольку какая-то функция здесь не поддерживается.
Подписываюсь под каждым словом.

Я в конечном итоге решил свою задачу.
Но это потребовало уйму времени - которого не хватает и всегда жаль тратить на "долбешку головой об стену".
Добрый день!

Вынужден присоединиться к теме.
Не могу удержаться - "брошу свой камень".
Документация не самая сильная сторона вашей замечательной системы.
Скачал примеры с http://simplight.ru/news/118-05-05-2015-sl-4-4.
Что могу сказать, те примеры которые можно скачать на странице, они такие … примеры, что просто "…кушать не могу …"
Нет, они очень даже хорошие примеры, НО:
1) как я могу оценить работу примера, если база пуста, и какие даты не вводи - все равно получишь 0 (можно было бы разместить еще одну кнопочку, которая бы запускала скрипт, который заполнял бы базу значениями для полноценной работы примера - заодно и хороший пример того, как записывать данные в базу - лично для меня сейчас это актуальная задача)
2) хорошо, вы скажите, что пример приведен просто для того, что посмотреть как писАть скрипты. Отлично. Посмотрел. Что вижу? функцию GetOperationTimeValueFromDB. Заинтересовался, что за функция-процедура. И … ничего не нашел. А нету никакой информации про нее. НЕТУ!

Вы знаете. Я из программистов. Из бывших. Ну в том смысле, что давно ушел из большого спорта. Я смогу понять из описания по CTRL+SPACE про что эта функция. Но вы знаете, программисты - они такие фантазеры, что никакая фентези и рядом не стояла.
Уважаемые разработчики, ну сделайте пожалуйста простой файлик (в смысле pdf-файлик) с описанием всех функций процедур, что бы мы точно знали, что ожидать от этих функций. Ну а если там же привести примерчики (с пояснениями, а то в примерах ну ни одного коммментария, просто ахтунг!) основных задач (как считать канал, как считать в exel канал за определенной время, как записать в базу значения за определенное время, … и т.д.), то цены вам не будет во веки веков. Аминь!

С уважением, Кондратенко Анатолий
Новочеркасск

Успехов! Удачи! Терпения в общении с нами, пользователями. :)
День добрый.

Спасибо за Ваши замечания. Да, на примеры и написание справок не всегда хватает времени и ресурсов, причем с примерами ещё не все так плохо, а вот с написанием справки дела обстоят интересней)) но мы исправимся. Для начала давайте мы сделаем более удобное описание внутренних процедур и функций SIMP, с описанием и примерами, оформим в pdf. Будем тогда выкладывать промежуточные варианты сюда на обсуждение. Как Вам такой вариант?
"… Благодарность наша будет безграничной, в разумных пределах …"
:woohoo:
Добрый день!

Занимался я тут вопросом записи в базу данных произвольных значений с помощью SaveChannelToDB.
Получил необычные результаты.
Долго разбирался пока не заподозрил неладное.
Проверил эту догадку - и действительно - запись в базу данных вовсе не изменяет имеющееся там значение (как я ожидал), а просто кидает еще одно значение. Примерно так:

10.06.2015 2:00:00 33
10.06.2015 2:00:00 77

Так и должно быть? :unsure:
Или есть еще какие-то варианты ?

С уважением, Кондратенко Анатолий
Новочеркасск
День добрый, Анатолий.

Занимался я тут вопросом записи в базу данных произвольных значений с помощью SaveChannelToDB.
Получил необычные результаты.
Долго разбирался пока не заподозрил неладное.
Проверил эту догадку - и действительно - запись в базу данных вовсе не изменяет имеющееся там значение (как я ожидал), а просто кидает еще одно значение. Примерно так:

10.06.2015 2:00:00 33
10.06.2015 2:00:00 77

Так и должно быть? :unsure:
Или есть еще какие-то варианты ?

Все верно, текущий движок БД, не позволяет ни менять не редактировать данные находящиеся в базе, по этой причине и происходит наложение временных меток друг на друга. Какие есть варианты, мм…скорей всего контролировать в скрипте временную метку при записи. БД, давно просится в переработку, как руководство даст отмашку, займемся этим вопросом. На сколько знаю планируют два вида БД на выбор при установке, внутренняя БД или SQL БД.
"…скорей всего контролировать в скрипте временную метку при записи. БД…"

А зачем? Что мне это даст, если изменить имеющееся там значение я не могу.
Или Вы имели ввиду то, что с помощью этой проверки можно не допустить запись в базу другого значения с такой же временной меткой?
"…скорей всего контролировать в скрипте временную метку при записи. БД…"

А зачем? Что мне это даст, если изменить имеющееся там значение я не могу.
Или Вы имели ввиду то, что с помощью этой проверки можно не допустить запись в базу другого значения с такой же временной меткой?

Да, именно это, не допустить дублирования временных меток. Изменить существующую запись повторюсь на данный момент нельзя.

p.s. Анатолий, можете рассказать какую задачу решаете?
Добрый день! Дабы не плодить лишних тем, спрошу здесь.
В Delphi (паскаль) поддерживается синтаксис: #10 - конец строки и #13 - код возврата каретки (переноса строки). В Симплайте такое возможно для вывода сообщения, к примеру, в две строки?
Код WriteValue('Таймер', 'Работа'+#10+#13+d+' дн. '+h+' ч.'+m+' м.'+s+' с.') ошибок при компиляции не выдал, но текст отразил в одну строку.
Добрый день.

Дабы не плодить лишних тем, спрошу здесь.
В Delphi (паскаль) поддерживается синтаксис: #10 - конец строки и #13 - код возврата каретки (переноса строки). В Симплайте такое возможно для вывода сообщения, к примеру, в две строки?
Код WriteValue('Таймер', 'Работа'+#10+#13+d+' дн. '+h+' ч.'+m+' м.'+s+' с.') ошибок при компиляции не выдал, но текст отразил в одну строку.

Компоненты мнемосхем в SIMP не поддерживают многострочный вывод текста. Добавим в лист доработок.

Сервис поддержки клиентов работает на платформе UserEcho