Операторы и функции работы с периферийными модулями — AM2302 /DHT22. GDHTT{}. Получение температуры с датчика DHT22.






PICµBASIC V4.x.x

Полное руководство по оборудованию и языку программирования


































Beta VERSION jan18
Общее описание
Платформа: NEW Device
Минимально: Контроллер семейства PIC18F46K22, одна микросхема внешней памяти 24LC1024.
Контроллер семейства PIC18F46K22, две микросхемы внешней памяти 24LC1024, часы реального времени DS1307, микросхемы интерфейсов ST232, ST485, символьный ЖКИ, графический ЖКИ UC1601, обвязка для шины 1-Wire, для чтения EM-marine карт, ETHERNET модуль, выходные ключи И многое другое. Неподключенные микросхемы/модули не влияют на общую работоспособность. Не будут работать только команды с ними связанные.

Память программ
Память программ 2048 строк.
Файловая система (встроенная)
Требуется установка второй микросхемы памяти. Общий размер диска 128 кб. Максимальное количество файлов – 64.
Максимальный размер файла 65534 байт . Поддерживаются все основные функции стандартной файловой системы.
Файловая система (дополнительная )
Доступна при подключении модуля расширения
Энергонезависимая память данных
Общий размер - 1024 байт. Предназначена для хранения пользовательских данных, настроек и др. Поддерживаются функции побайтного доступа и блочного доступа. То есть можно сохранять/читать как одну переменную, так и массив.

Переменные
Числа:
Все числа являются знаковыми целыми в диапазоне от - 8 388 608 до + 8 388 607 или -32767 до +32767 либо целыми в диапазоне 0-255
Текст:
Текст всегда заключается в кавычки ”text”. Строка текста – текстовая переменные 64 байта с длиной текста до 63 символов *$(x), *¤ , *¤A-*¤X. Первый байт – длина.
Память переменных:
Для всех переменных выделена линейная область оперативной размером 1536 байт памяти. На нее отображаются все переменные и стеки.

Числовые переменные: 8 бит целое
Отображаются на всю память переменных по индексу (адресу).
Существует три индексных переменных $(index) , #( index) , @(index). Индексом может быть число от 0 до 1535 или простая переменная, при этом ее значение должно быть в этом же диапазоне. Индекс соответствует адресу ячейки. Пустой индекс не допускается. Внутреннее представление 8-битное. Значение всех переменных с одним индексом – одинаковое. Основное применение – 8 бит переменная, косвенная адресация, работа с текстами и массивами.
При работе с арифметическими операторами значение представляется числом от 0 до 255. При математических операциях с разными типами в индексные переменные записывается и читается младший байт от переменных другого типа. Глубина вложения индексов ограничена внутреннем стеком вычислителя. Запись #(#(#(#(5)))) не является ошибкой. Таким образом можно организовывать многомерные массивы.
Их отличие - при выводе.
Отображение при печати оператором PRINT значения ячейки 0х4А по адресу 20
$(20) - представление как символ с кодом 0х4А – J по таблице ASCII
#(20) - представление десятичного числа - 74
@(20) - представление как HEX запись – 4A
16 бит целое со знаком.
Отображаются на всю память переменных по индексу (адресу).
Существует две индексных переменных #2( index) , @2(index). Индексом может быть число от 0 до 1534 или простая переменная, при этом ее значение должно быть в этом же диапазоне. Индекс соответствует младшему адресу ячейки.
Переменная занимает два байта в адресном пространстве index,index+1. Старший байт числа в младшем адресе
Пустой индекс не допускается. Внутреннее представление 16-битное со знаком. Внутреннее представление 16-битное со знаком. Отрицательные числа записываются в дополнительном коде. Значение всех переменных с одним индексом – одинаковое. Основное применение – 16 бит переменная, косвенная адресация, работа с массивами.
При работе с арифметическими операторами значение представляется числом от -32768 до +32767. При математических операциях с разными типами в индексные переменные записывается и читается младший байт от переменных 8 бит или два младших байта от переменных 24 бит с сохранением знака.
Их отличие - при выводе.
Отображение при печати оператором PRINT значения ячейки 0х4А по адресу 20 и 0х58 по адресу 21
#2(20) - представление десятичного числа со знаком 19032
@2(20) - представление как HEX запись 4A58
24 бит целое со знаком.
Существует 52 обычных переменных, обозначаемых буквами от A до Z и a-z и 105 индексных #3(xx), @3(xx) Внутреннее представление 24-битное со знаком. Отрицательные числа записываются в дополнительном коде. Отображаются на память с адреса 512 по 667 для буквенных и с 512 по 829 для индексных. Каждая переменная занимает 3 байта, старший байт числа в младшем адресе. При печати оператором PRINT отображаются знаковыми целыми в диапазоне от - 8 388 608 до + 8 388 607
Пример записи выражения с переменными: 10 C=А+b:#(100)=55:$(A)=C +(10/2+1)*2
Существует две индексных переменных #3(index) , @3(index). Индексом может быть число от 0 до 105 или простая переменная, при этом ее значение должно быть в этом же диапазоне.
Отображаются на память обычных переменных и дальнейшее адресное пространство (на память с адреса 512 по 829).
Так #3(0) отображается на переменную A , #3(1) отображается на переменную B. Индексы с 52 до 105 на простые переменные не отображаются.
Отличие при выводе оператором PRINT аналогично 16 бит индексным переменным

Индексные переменные
Это переменные типа #(xx),#2(xx),#3(xx),$(xx),@(xx),@2(xx),@3(xx). Переменные 16 бит если пред скобкой стоит 2, 24 бит если стоит 3, остальные 8 бит. Во избежание наложения переменных при использовании стеков и обычных переменных не рекомендуется использовать значение индекса более 511 для 8 бит, более 510 для 16 бит и от нуля до 51 и свыше 105 для 24 бит. Или требуется точно представлять, какие переменные используются в программе и как избежать наложения. Сами операторы позволяют получить полный доступ к памяти.

Текстовые строки
Отдельной записи переменных типа «текст» не предусмотрено, тем не менее, поддерживается работа со строками текста. Для этого предусмотрен формат хранения строк в 8 битных индексных переменных. Любая строка текста может быть записана в массив индексной переменной $(x). Строка обозначается как *$(x). В первой ячейке массива $(x) хранится длинна текста - байт от 0x00 до 0x7F, в остальных сам текст в ASCII кодах символов. Следует следить за размером текстовых массивов и их возможным наложением друг на друга или на другие переменные. Допускается длинна текстовой переменной 64 байт, включая байт длинны переменной. Операции над текстовыми переменными могут быть двух видов: присваивание и сложение. Все остальные преобразования реализуются с помощью операторов и функций.
*$(30)=*$(50)+”add text”+*$(10)

Стек переменных
Стек переменных организован в области памяти начиная с адреса 832 до 1023, и имеет размер 192 байт (64 знаковых или незнаковых переменных). Тип стека LIFO. ([ Cкачайте файл, чтобы посмотреть ссылку ]). Адрес стека движется вверх при увеличении указателя. Не зависимо от исходного типа, одна запись всегда занимает три байта, старший байт числа в младшем адресе.
Основное применение – локальные переменные в программах/подпрограммах и передача параметров к ним/от них. Выделение памяти для подпрограмм.

Операции с стеком чисел.
Символ подстановки – знак параграфа §, набирается на клавиатуре как alt+21 (удерживая ALT на цифровой клавиатуре набрать 2 и 1 ) или alt+0167
Символ подстановки используется вместо имени переменной.
Он может быть использован как простая переменная §=55 ; A=§ ; PRINT §
Как переменная в индексе #(§)=55 ; PRINT #(§); a=#(§)
Если переменной с именем § присваивается какое либо значение, то оно будет помещено в стек и указатель стека увеличится. Первая запись займет адреса (832:833:834), вторая (835:836:837) и так далее до исчерпания стека. Переполнение вызовет сдвиг стека с потерей данных в верхушке (832:833:834) стека(первая запись). Их заменят данные из 835:836:837 (вторая запись). А последняя запись займет последнее место (1021:1022:1023). Таким образом, в стеке можно организовать циклический буфер.
Если переменная § читается, то значение будет выбрано из стека, и указатель стека уменьшится.
Если стек пуст, то всегда будет читаться значение из первой записи (832:833:834),
Пример
§=5+3 (832:833:834) = 0x00:0x00:0X08
§=55 (835:836:837) = 0x00:0x00:0X37 ; (832:833:834)= 0x00:0x00:0X08
A=§
B=§
C=§
После выполнения : A=55, B=8, C=8
Указатель стека не изменяется, в случае использования функций работающих с массивами данных или текстовыми строками, например: CRCD, CRCM, SCOMP, INSTR, и при этом символ подстановки используется в качестве индекса для индексных переменных. В описании функции в этом случае явно указано воздействие на стек.
Указатель стека не изменяется в операторе NEXT при ветвлении на начало цикла, повышается при первом присвоении счетчика цикла и понижается при выходе. FOR §=0 TO x . NEXT § работает корректно со стеком, занимая всего одну позицию и освобождая ее в конце цикла.

Операции с указателем стека – операторы.
§+ увеличение указателя стека – аналогично записи в стек числа, без изменения самих значений в памяти
§- уменьшение указателя стека – аналогично чтения из стека числа, без изменения самих значений в памяти
§^ Обнуление указателя стека
Также стек обнуляется при выполнении оператора RUN, CLR. Также можно получить размер занятого стека.

Локальные (виртуальные) переменные, выделение памяти для задач.
Часто необходимо предать подпрограмме параметры – это решается заполнением стека нужными параметрами и вызовом подпрограммы. Но подпрограмме нужен произвольный доступ к последним данным в стеке без использования переменных, для этого можно использовать локальные (виртуальные) переменные.
Они именованы сочетанием символа стека и большой буквой латинского алфавита A-Z : §A - §Z.
Всего их 26. Нумерация согласно алфавита. Эти виртуальные переменные отображаются А- последний элемент стека на верхушке стека, B – предпоследний, и так до конца. Если стек заполнен менее чем 26 значений, все остальные ссылаются на первый элемент стека. (для совместимости оставлен доступ по русским буквам А-Я)
Также если подпрограмме надо работать с несколькими локальными переменными то выделяем в стеке нужное количество памяти оператором §+ и работаем с виртуальными переменными, при выходе понижаем стек §-. Это позволяет разделить глобальные переменные и локальные в подпрограммах. Во всем остальном виртуальные переменные равнозначны обычным 24-битным переменным.

Стек текстовых строк
Стек текстовых переменных организован в области памяти начиная с адреса 1024 до 1527, и имеет размер 504 байт (24 строки длинной до 20 байт каждая.). Стек движется вверх при увеличении указателя. Не зависимо от исходного типа, одна запись всегда занимает 21 байт, 20 байт для хранения текста и 1 байт – длинна текстовой записи.
Основное применение – локальные текстовые переменные в программах/подпрограммах и передача параметров к ним/от них, Выделение памяти под текстовые переменные для подпрограмм.

Операции со стеком.
Символ подстановки – знак валюты ¤, набирается на клавиатуре как alt+15 (удерживая ALT на цифровой клавиатуре набрать 1 и 5 ) или alt+0164. Символ подстановки используется вместо имени текстовой переменной $(index).

Операции с указателем стека – операторы.
¤+ увеличение указателя стека – аналогично записи в стек числа, без изменения самих значений в памяти
¤- уменьшение указателя стека – аналогично чтения из стека числа, без изменения самих значений в памяти
¤^ Обнуление указателя стека
Также стек обнуляется при выполнении оператора RUN, CLR. Также можно получить размер занятого стека.


Виртуальные текстовые переменные, выделение памяти для задач.
Часто необходимо предать подпрограмме параметры – это решается заполнением стека нужными параметрами и вызовом подпрограммы. Но подпрограмме нужен произвольный доступ к последним данным в стеке без использования переменных, для этого можно использовать виртуальные переменные.
Они именованы сочетанием символа стека и большой буквой латинского алфавита A-X : ¤A - ¤X.
Всего их 24. Нумерация согласно алфавита. Эти виртуальные переменные отображаются А- последний загруженный элемент стека, B – предпоследний, и так до конца. Если стек заполнен менее чем 24 значения, все остальные ссылаются на первый элемент стека.
Также если подпрограмме надо работать с несколькими локальными переменными то выделяем в стеке нужное количество памяти оператором ¤+ и работаем с виртуальными переменными, при выходе понижаем стек ¤-. Это позволяет разделить глобальные переменные и локальные в подпрограммах. Во всем остальном виртуальные переменные равнозначны обычным текстовым строкам.

Преобразование типов переменных
Все операции производятся над 24 битными числами
- Если исходное число 8 битное (0-255) то преобразуется в 24 битное в диапазон 0-255.
- Если исходное число 16 битное (-32767 до +32767) то преобразуется в 24 битное в диапазон -32767 до +32767.
После вычислений происходит преобразование типа согласно типу принимающей переменной.
Если принимающая переменная 8 бит то от 24 битного числа в нее помещается младший байт.
Если принимающая переменная 16 бит то 24 битное число урезается в диапазон -32768 до +32767 путем отброса старших 8 бит значения с сохранением знака. Пример:
-1 = -1
-32768 = -32768
- 8 388 608 = -32768
+ 8 388 607 = 32767
+ 32767 = + 32767
+1 = +1
0 = 0
Если принимающая переменная текстовая и исходная текстовая, то копируется строка (включая символьный стек).
Пример
*$(15)=*$(30) текст из переменной $(30) длинна в ячейке 30 , далее сам текст будет скопирован в $(15) – длинна в ячейке 15 , далее текст.
*¤ = *$(15) – помещение текста в стек. Стек повышается.
*$(40)=*¤ - извлечение из стека. Стек понижается.
*$(60)=* ¤B - извлечение из стека второго элемента .Стек не изменяется.

Относительный переход
Для операторов GOTO, GOSUB, CASE можно указывать номер строки, куда выполняется переход – прямая адресация. Также можно указывать смещение со знаком – относительный переход от номера текущей строки.
Пример:
33 GOTO 100 выполняет переход на строку с номером 100
33 GOTO +10 выполняет переход на строку с номером 43 (33+10)
33 GOTO -5 выполняет переход на строку с номером 28 (33-5)

Подпрограммы
Подпрограммы вызываются оператором GOSUB с указанием номера строки старта подпрограммы. Всегда должна заканчиваться оператором RETURN. Глубина вложений -24 вызова. Также подпрограммой является обработчик прерывания.

Системные таймеры.
Имеется 8 системных таймеров разрядностью 16 бит с периодом одного тика равным 100 mS. Для них доступны прерывания по окончанию счета. И имеется 8 малых системных таймеров с периодом одного тика равным 1 S. Для них не доступны прерывания.

Прерывания
Существует пять типов программируемых прерываний: при окончании работы таймера - 8 векторов, при получении данных в UART - два вектора, При изменении состояния выделенных I/O - 4 вектора, по нажатию кнопки (требуется подключенный дисплей) – 1 вектор, при записи в контроллер значения по протоколу MODBUS – 1 вектор.
Прерывания по таймеру.
Можно указывать номер строки, где будет вызвана подпрограмма (аналогично GOSUB) при срабатывании таймера, для каждого таймера – свой номер. Подпрограмма должна заканчиваться RETURN.
Это позволяет организовать выполнение запланированных задач, прерывая основную программу на время обработки события. Например - опрос датчиков. Для исключения наложения переменных используйте выделенный диапазон или стек. Нулевой номер строки отключает прерывания. После срабатывания прерывания, для повторного запуска требуется снова запрограммировать таймер. Следует выполнять непосредственно перед оператором RETURN.
Прерывания по UART.Для 2 и 3 порта UART можно запрограммировать по 1 прерыванию на каждый порт. Прерывание программируется либо по достижению указанного количества символов в приемном буфере порта либо при приеме символа с кодом символа 0x0D (конец текстовой сроки). При срабатывании прерывания оно автоматически отключается, и требуется в обработчике повторное включение. Следует выполнять непосредственно перед оператором RETURN.
Прерывания по изменению состояния I/O - 4 вектора, по одному на каждый выделенный порт. При срабатывании прерывания оно автоматически отключается, и требуется в обработчике повторное включение. Следует выполнять непосредственно перед оператором RETURN.
Прерывание по кнопке. Если подключен и настроен дисплей, то можно запрограммировать прерывание по нажатию любой кнопки. При срабатывании прерывания оно автоматически отключается, и требуется в обработчике повторное включение. Следует выполнять непосредственно перед оператором RETURN.
Приоритет прерываний. Если все прерывания возникнут одновременно, то сначала будут вызываться обработчики для IO, начиная со старшего, затем от UART начиная со старшего, затем по таймеру начиная со старшего, а последним прерывание по кнопке. Глубина стека подпрограмм 24 вызова. При всех одновременно вызванных прерываниях будет занято 15 позиций, остальные можно использовать в программе пользователя. Соответственно программа пользователя может использовать все доступные при меньшем количестве запрограммированных прерываний.

Отладка программ
Можно в любом месте устанавливать дополнительную строку, или в конце текущей помешать оператор STOP. И программа будет остановлена в этом месте. Далее в командном режиме можно просмотреть значения переменных(изменить при необходимости) и далее продолжить выполнение с точки останова оператором CONTINUE. Если требуется продолжение с другой строки – требуется переназначение номера оператором GOTO с явным указанием номера до продолжения оператором CONTINUE.
Дополнительные возможности.
Операторы TRACE и DEBUG позволяют отслеживать непрерывно в консоль номера строк выполняемой программы и значение выбранной переменной в процессе выполнения программы.

Арифметические операторы :
+ сложение
- вычитание
* умножение
/ целочисленное деление (нужно иметь в виду, что, например, 14/5=2)
% - взятие остатка от деления (14%5=4)
Логические операторы :
& побитное И
| побитное или
^ побитное исключающее или
! побитная инверсия
Операторы сравнения : 
= равно  <> (или ><) не равно > больше < меньше >= (или =>) больше или равно <= (или =<) меньше или равно
Результатом выполнения оператора сравнения является число =1 если истина и =0 если ложь.
Оператор присваивания:
Символ “=”
A = выражение/функция
$(x) = выражение/функция
*$(x) = выражение/функция которая возвращает текст
Сокращенная запись для присваивания нуля числовым переменным: A=:#(x)=:.

Выражения
Выражения составляются из чисел, переменных, арифметических логических и битовых операторов. Операторы сравнения могут быть использованы в выражениях. Вычисления производятся слева направо. Применением скобок можно изменить порядок вычислений. Существует 4 уровня приоритета выполнения :
- сначала вычисляются выражение с унарными операторами + и – например: A=-B*2, при этом первым будет выполнено взятие B с противоположным знаком; - затем вычисляются выражения с * и / и % - затем вычисляются выражения с + и -
- затем вычисляются выражения с логическими операторами или операторами сравнения & | ^ ! < > =
В каждой группе приоритетов все равнозначные выполняются слева на право. Для изменения порядка используйте скобки.
Функции могут быть использованы в выражениях только в качестве первого аргумента без лидирующих скобок.
IF SQR{A*A+B*B}+10>=(5*i)+10 THEN GOTO +5
В этом случае сначала вычисляется выражение в фигурных скобках, затем вычисляется функция, затем общее выражение, где вместо функции подставляется ее результат. Далее уже выполняется оператор IF THEN . с результатом выражения
Получение результата сравнения в переменную. F=SQR{A*A+B*B}+10=(5*i)+10 переменной F присваивается значение 1 (true) если выражение истинно и 0 (false) если ложно

Функции
Функции могут быть одного или нескольких аргументов, перечисленных через запятую в фигурных скобках и записывается слитно с именем функции. Пример записи A=ROR{#(100),5}:C=SQR{A*A+B*B} В качестве аргумента могут выступать числа, переменные, выражения.

Операторы языка программирования
Оператор всегда записывается с начала строки или сразу после разделителя строки «двоеточие». Если оператор не имеет параметров то сразу за ним требуется конец строки или разделитель строки. Если параметры есть, то они начинают записываться списком через один пробел после имени оператора. Концом списка является конец строки или разделитель строки. Если их несколько, то перечисляются через запятую. Для некоторых через точку с запятой или пробел. В качестве параметров могут выступать числа, переменные, для некоторых – текст или выражения.

Листинг программы
Все строки программы нумеруются от 0 до до 2047
В одной строке могут быть записаны несколько выражений и/или функций и/или операторов через : двоеточие.
Внимание : Некоторые операторы могут быть либо единственными в строке, либо последними. Как правило это операторы передачи управления.
Принята обычная запись функций и операторов ПРОПИСНЫМИ буквами. Регистр имеет значение. Длинна строки ввода ограничена 63 символами, не включая номер и пробел после него. Последний байт строки всегда 0x0D. Рекомендуется использовать наибольшее заполнение для экономии памяти, если надо. Лишние символы в конце строки игнорируются. Программа выполняется до последней строки и останавливается. Остановить или закончить выполнение раньше можно командами STOP, END . Для постоянной работы используйте бесконечный цикл.
Есть оператор обработки ошибок NOERR, который позволяет выполнить переход на другую часть программы при возникновении ошибки в основной части без остановки выполнения программ.
Встроенный редактор
Добавление новой строки или замена строки с одинаковым номером - набрать строку с номером.
Удаление строки – набрать только номер строки (пустая строка).
Копирование строки - команда COPY . Для копирования массива строк команда COPY может быть использована и в программе. Для удаления строки командой COPY надо скопировать несуществующую строку в удаляемую строку или из консоли просто набрать ее номер без текста. Таким образом можно менять структуру программы из самой программы.

Метки
Меткой перехода является номер строки. Количество ограничено размером самой программы. От 0 до 2047
Если строки не существует, то выполняется ближайшая с большим номером. Пример допустимых меток: 10, 200, 210.

Работа с файловой системой
Типы имен - формат 8.3, например README.txt. Регистр имеет значение. Пробелы в имени между буквами не допускаются. Имя файла должно содержать как минимум одну букву, точку и одну букву в расширении. Перед началом использования диск должен быть предварительно отформатирован.
Для работы с файлом на чтение / запись он должен быть предварительно открыт на чтение и/или запись. После работы с файлом, файл должен быть закрыт. Одновременно может быть открыт только один файл, поддерживается потоковый и блочный обмен. Поддерживаются все стандартные функции файловой системы, см. операторы работы с файлами. Некоторые команды работают только с консоли. Можно писать уже в существующие файлы, с указанием позиции записи. Можно читать любой файл с любого места. Можно читать и писать данные в файлы в текстовом, бинарном виде. Так же поддерживается ввод /вывод переменных в / из файла в текстовой, бинарной и HEX записи. Имена файлов записываются текстом в кавычках “LOG.txt” или задаются в индексных переменных, как текст. Например *$(10) , где в байте $(10) указанна длинна текста без учета ячейки $(10), а в ячейках $(10+1), $(10+2), находится сам текст.
Чтение. При открытии файла на чтение указатель устанавливается на начало файла.
Запись. При открытии существующего файла на запись указатель устанавливается на начало файла и файл открывается для циклической записи. Попытка записи в следующий байт за концом файла, запись будет произведена в начало файла.
При открытии несуществующего файла, такой файл будет создан. Запись в каталог будет произведена при закрытии файла с указанием длинны файла согласно записанным в него данных.
При удалении файла происходит дефрагментация диска и освобождается место.
При быстром удалении файла очищается только каталог, место не освобождается. Дефрагментацию можно выполнить отдельным оператором.


Потоки ввода-вывода
Поток КОНСОЛЬ – по умолчанию. Текстовый ввод/вывод. В качестве интерфейса консоли может использоваться USART, USB, ETHERNET.
Поток ДИСПЛЕЙ - ЖКИ дисплей, подключенный к контроллеру и клавиатура
Поток UART - USART контроллера с возможностью работы через 485 интерфейс. Бинарный и текстовый ввод/вывод
Поток Ethernet UDP или TCP/IP клиент/сервер

Порты UART и протокол MODBUS
Контроллер имеет три порта UART. Первый порт - консоль с поддержкой протокола MODBUS RTU SLAVE и интерфейса RS485. Этот порт настраивается через оператор SET. Можно установить скорость порта и адрес в сети MODBUS. Настройки сохраняются в энергонезависимой памяти.
Второй порт - универсальный порт с поддержкой интерфейса RS485. Включение и настройка выполняются из программы. Если порт отключен, то его выводы используются как порты I/O. Поддерживает протокол MODBUS RTU MASTER.
Третий порт - с фиксированными настройками. Если выключен, то его выводы используются как порты I/O.
Контроллер имеет два интерфейса MODBUS. На порту UART1 (консоль) реализован как текстовый обмен с консолью, так MODBUS slave интерфейс. На порту UART2 реализован MODBUS master. Оба порта поддерживают 485 интерфейс. Порт UART3 не поддерживает MODBUS.

Интерфейс Ethernet
Реализуется с помощью подключаемого модуля расширения, см. документацию на модули расширения.

Быстродействие
Среднее время выполнения простых команд – 150 мкс @ 64MHz

Прошивка контроллера.
Контроллер программируется программой - загрузчиком один раз с помощью программатора. В дальнейшем загрузка и обновление PICµBASIC производится с помощью программы BOOTLOADER. Обновление не затрагивает программу пользователя и регистрацию. По желанию заказчика в язык могут быть добавлены команды аппаратной обработки любых датчиков, интерфейсов, протоколов.














Среда PICµBASIC V4.x Список команд, операторов, функций.

Список разделов
13 LINK \l "RZD_STANDART" 14Стандартные команды15
13 LINK \l "RZD_GOTO" 14Операторы передачи управления15
13 LINK \l "RZD_STACK" 14Стек и управление стеком15
13 LINK \l "RZD_CILE" 14Циклы и сравнения15
13 LINK \l "RZD_TIMER" 14Таймеры и задержки15
13LINK \l "RZD_MATCH"14Математические и логические функции 15
13 LINK \l "RZD_IO" 14Операторы ввода вывода 15
13 LINK \l "RZD_EEPROM" 14Работа с EEPROM15
13 LINK \l "RZD_TIME" 14Дата и время. Часы реального времени15
13 LINK \l "RZD_SET" 14Установки и настройки Группа операторов SET 15
13 LINK \l "RZD_INFO" 14Служебные и информационные операторы 15
13 LINK \l "RZD_STROKA" 14Операторы и функции работы со строками 15
13 LINK \l "RZD_PORT" 14Операторы и функции работы с портами ввода – вывода 15
13 LINK \l "RZD_DISKR" 14Операторы и функции работы с дискретными входами 15
13 LINK \l "RZD_KEY" 14Операторы и функции работы с кнопками15
13 LINK \l "RZD_1WIRE" 14Операторы и функции работы с периферийными модулями 1-Wire15
13 LINK \l "RZD_DHT22" 14Операторы и функции работы с периферийными модулями - AM2302 /DHT2215
13 LINK \l "RZD_HD44780" 14Операторы и функции работы с дисплеем HD4478015
13 LINK \l "RZD_UC1601" 14Операторы и функции работы с дисплеем UC1601s15
13 LINK \l "RZD_UART" 14Операторы и функции работы с периферийными модулями - USART, RS485 15
13 LINK \l "RZD_RFID" 14Операторы и функции работы с периферийными модулями - RFID 15
13 LINK \l "RZD_FS" 14Операторы и функции работы с Flash disk15
13 LINK \l "RZD_I2C" 14Операторы и функции работы с шиной I2c 15
13 LINK \l "RZD_MHZ" 14Операторы и функции работы с датчиками MH-Z19, MH-Z16, COZIR, SHT10 15
13 LINK \l "RZF_MODBUS" 14Сетевые операторы и функции протокол MODBUS RTU15
13 LINK \l "RZD_MODBUS_SLAVE" 14MODBUS slave интерфейс контроллера15
13 LINK \l "RZD_ETHERNET" 14Сетевые операторы и функции Ethernet 15

Приложения
13 LINK \l "PRIL_HD44780" 14Дисплей с контроллером HD44780 15
13 LINK \l "PRIL_UC1601" 14Дисплей с контроллером UC1601s 15

Алфавитный перечень

13 LINK \l "ABC" 14ABC{}15 Возвращает абсолютное значение числа
13 LINK \l "ADC_FUN" 14ADC{}15 Чтение результата преобразования АЦП
13 LINK \l "AT" 14AT15 Установка курсора HD44780
13 LINK \l "AT_UC" 14AT15 Установка текстового курсора дисплея UC1601s
13 LINK \l "BEEP" 14BEEP15 Генерация звука
13 LINK \l "BOOT" 14BOOT15 Отмена инсталляции прошивки BASIC и запуск бутлоадера
13 LINK \l "BREAK" 14BREAK15 Прерывает выполнение программы из консоли
13 LINK \l "CALL_FUN" 14CALL{}15 Вызов подпрограммы в машинных кодах
13 LINK \l "CASE" 14CASE15 Условный переход по списку условий и адресов
13 LINK \l "CLK" 14CLKx15 Генератор частоты (меандр) на выходе CCPx 2.5 кГц - 5,2 МГц
13 LINK \l "CLOSE" 14CLOSE15 Закрывает ранее открытый файл
13 LINK \l "CLR" 14CLR15 Очищает все переменные
13 LINK \l "CLS" 14CLS15 Очистка экрана дисплея HD44780
13 LINK \l "CLS_UC" 14CLS15 Очистка экрана дисплея UC1601s
13 LINK \l "CRCD" 14CRCD15 Генерация CRC-8 Dallas/MAXIM полином 0xA1h
13 LINK \l "CRCD_FUN" 14CRCD{}15 Проверка CRC-8 Dallas/MAXIM полином 0xA1h
13 LINK \l "CRCM" 14CRCM15 Генерация Modbus RTU CRC16 полином 0xA001h
13 LINK \l "CRCM_FUN" 14CRCM{}15 Проверка Modbus RTU CRC16 полином 0xA001h
13 LINK \l "CREATE" 14CREATE15 Создаёт файл
13 LINK \l "CODE" 14CODE15 Ввод кода
13 LINK \l "CONTINUE" 14CONTINUE15 Продолжение выполнения программы
13 LINK \l "COPY" 14COPY15 Копирует строку программы
13 LINK \l "COS" 14COS{}15 Вычисление косинуса аргумента в градусах
13 LINK \l "CZCMD" 14CZCMD15 Оператор отправки команд команд датчику Cozir
13 LINK \l "CZINI" 14CZINI15 Оператор инициализации датчика Cozir
13 LINK \l "CZRD_FUN" 14CZRD{}15 Функция получения данных с датчика Cozir
13 LINK \l "DATA" 14DATA15 Определения блока числовых или текстовых данных
13 LINK \l "DATE" 14DATE{}15 Получить дату в переменную
13 LINK \l "DAY" 14DAY15 Установка календаря – день месяца
13 LINK \l "DAY_FUN" 14DAY{}15 Получить текущий день месяца
13 LINK \l "DAYS" 14DAYS15 Установка календаря – день недели
13 LINK \l "DAYS_FUN" 14DAYS{}15 Получить текущий день недели
13 LINK \l "DEFRAG" 14DEFRAG15 Выполняет дефрагментацию диска.
13 LINK \l "DEL" 14DEL15 Удаляет файл с указанным именем
13 LINK \l "DELF" 14DELF15 Удаляет файл с указанным именем без дефрагментации (быстрое)
13 LINK \l "DIR" 14DIR15 Вывод в консоль каталога
13 LINK \l "DIR_FUN" 14DIR{}15 Проверка существования файла
13 LINK \l "DIRF_FUN" 14DIRF{}15 Получить имя файла
13 LINK \l "DRAV_UC" 14DRAW15 Рисование линий для дисплея UC1601s
13 LINK \l "END" 14END15 Окончание программы
13 LINK \l "EOF_FUN" 14EOF{}15 Проверка конца файла
13 LINK \l "EXFOR" 14EXFOR15 Принудительный выход из цикла
13 LINK \l "FCOPY" 14FCOPY15 Копирует файл в пределах диска
13 LINK \l "FLUSH" 14FLUSH15 Сброс дискового кеша
13 LINK \l "FOPEN" 14FOPEN15 Открывает файл на чтение и/или запись.
13 LINK \l "FOR" 14FOR15 Оператор цикла – начало цикла
13 LINK \l "FORMAT" 14FORMAT15 Форматирует Flash диск
13 LINK \l "FPRINT" 14FPRINT15 Вывод на печать в ранее открытый файл
13 LINK \l "FREAВ_FUN" 14FREAD{}15 Чтение из ранее открытого файла в переменные
13 LINK \l "FSAVE" 14FSAVE15 Вывод данных (переменных) в ранее открытый файл
13 LINK \l "GCLK_FUN" 14GCLK{}15 Счетчик импульсов
13 LINK \l "GDHTH_FUN" 14GDHTH{}15 Получение влажности с датчика DHT22
13 LINK \l "GDHTT_FUN" 14GDHTT{}15 Получение температуры с датчика DHT22
13 LINK \l "GKEY_FUN" 14GKEY{}15 Опрос кнопки/кнопок
13 LINK \l "GKEY1_FUN" 14GKEY{ }15 Опрос входов без изменения направления ввода-вывода.
13 LINK \l "GOSUB" 14GOSUB15 Оператор вызова подпрограммы
13 LINK \l "GOTO" 14GOTO15 Оператор перехода
13 LINK \l "GTEMP_FUN" 14GTEMP{}15 Чтение температуры с датчика DS18B20
13 LINK \l "GTOP_NUM_FUN" 14GTOP#{}15 Получить указатель числового стека
13 LINK \l "GTOP_TXT_FUN" 14GTOP${}15 Получить указатель текстового стека
13 LINK \l "HOUR" 14HOUR15 Установка часов – часы
13 LINK \l "HOUR_FUN" 14HOUR{}15 Получить текущее время – часы
13 LINK \l "IF" 14IF15 Конструкция IF THEN – проверка условия
13 LINK \l "IFELSE" 14IFELSE15 Конструкция IFELSE THEN – проверка условия с указанием строки перехода
13 LINK \l "I2ADRR" 14IIADRR15 Запись 7 битного адреса на чтение
13 LINK \l "I2ADRR_FUN" 14IIADRR{}15 Запись 7 битного адреса на чтение с проверкой подтверждения
13 LINK \l "I2ADRW" 14IIADRW15 Запись 7 битного адреса на запись
13 LINK \l "I2ADRW_FUN" 14IIADRW{}15 Запись 7 битного адреса на запись с проверкой подтверждения
13 LINK \l "I2RУ" 14IIRE{}15 Завершающее чтение 8bit данных I2c
13 LINK \l "I2RD" 14IIRD{}15 Чтение 8bit данных I2c
13 LINK \l "I2STP" 14IISTP15 Cтоп обмена данными на шине I2c
13 LINK \l "I2STR" 14IISTR15 Старт обмена данными на шине I2c
13 LINK \l "I2WR" 14IIWR15 Запись 8bit данных I2c
13 LINK \l "INPUT" 14INPUT{}15 Оператор ввода данных с консоли с ожиданием ввода числа, текста, HEX записи
13 LINK \l "INSTR_FUN" 14INSTR${}15 Поиск вхождения строки
13 LINK \l "IOIRQ" 14IOIRQ15 Установка и настройка прерываний от портов ввода/вывода
13 LINK \l "IPCGF" 14IPCGF15 Получение текущих сетевых настроек в строку
13 LINK \l "IPNEW_FUN" 14IPNEW{}15 Получение нового IP адреса по DHCP
13 LINK \l "KEY_FUN" 14KEY{}15 Получить код кнопки/кнопок
13 LINK \l "KEYIRQ" 14KEYIRQ15 Включение и настройка прерывания от кнопок
13 LINK \l "LCDC" 14LCDC15 Послать команду в дисплей HD44780
13 LINK \l "LCDC_UC" 14LCDC15 Послать команду в дисплей UC1601s
13 LINK \l "LCDD" 14LCDD15 Послать данные в дисплей HD44780
13 LINK \l "LCDD_UC" 14LCDD15 Послать данные в дисплей UC1601s
13 LINK \l "LERR" 14LERR15 Выводит последнее сообщение об ошибке
13 LINK \l "LINIT" 14LINIT15 Включение и инициализация дисплея HD44780
13 LINK \l "LINIT_UC" 14LINIT15 Включение и инициализация дисплея UC1601s
13 LINK \l "LIST" 14LIST15 Вывод листинга программы
13 LINK \l "LOC_FUN" 14LOC{}15 Возвращает текущую позицию в файле
13 LINK \l "LOCK" 14LOCK15 Блокировка чтения программы
13 LINK \l "LOF_FUN" 14LOF{}15 Возвращает длину открытого файла
13 LINK \l "LPRINT" 14LPRINT15 Вывод на печать на ЖКИ индикатор HD44780
13 LINK \l "LPRINT_UC" 14LPRINT15 Вывод на печать на ЖКИ индикатор UC1601s
13 LINK \l "MDB" 14MDB15 Служебный оператор запроса Bootloader для DEVICE PICµBASIC
13 LINK \l "MDBSI_FUN" 14MDI{}15 Функция получения информации MODBUS RTU
13 LINK \l "MDBSR_FUN" 14MDR{}15 Функция чтения MODBUS RTU
13 LINK \l "MDBSW_FUN" 14MDW{}15 Функция записи MODBUS RTU
13 LINK \l "MDC" 14MDC15 Служебный оператор запроса консоли для DEVICE PICµBASIC
13 LINK \l "MDSR_FUN" 14MDSR{}15 Функция чтения данных устройства расширения MODBUS RTU
13 LINK \l "MDSW_FUN" 14MDSW{}15 Функция записи данных устройства расширения MODBUS RTU
13 LINK \l "MHZ_FUN" 14MHZ{}15 Получить концентрацию CO2 в PPM
13 LINK \l "MIDs" 14MID${}15 Функция подстроки
13 LINK \l "MIN" 14MIN15 Установка часов – минуты
13 LINK \l "MIN_FUN" 14MIN{}15 Получить текущее время – минуты
13 LINK \l "MONTH" 14MONTH15 Установка календаря – месяц
13 LINK \l "MONTH_FUN" 14MONTH{}15 Получить текущий месяц
13 LINK \l "NEXT" 14NEXT15 Оператор цикла – конец цикла
13 LINK \l "NEW" 14NEW15 Очистка программы
13 LINK \l "NOERR" 14NOERR15 Обработчик ошибок
13 LINK \l "PAUSE" 14PAUSE15 Пауза в работе программы в миллисекундах
13 LINK \l "PEEK_FUN" 14PEEK{}15 Чтение GPR/SFR регистра контроллера
13 LINK \l "PING_FUN" 14PING{}15 PING заданного узла
13 LINK \l "POINT_UC" 14POINT15 Установка графического курсора,сброс/ установка/ инверсия пикселя дисплея UC1601s
13 LINK \l "POKE" 14POKE15 Запись GPR/SFR регистра контроллера
13 LINK \l "PORT" 14PORT15 Установка дискретного порта
13 LINK \l "PORT_FUN" 14PORT{}15 Получение состояния дискретного порта
13 LINK \l "PORT1_FUN" 14PORT*{}15 Опрос состояния дискретного порта без изменения направления в/в
13 LINK \l "PRINT" 14PRINT15 Вывод на печать в консоль
13 LINK \l "PWM" 14PWMx15 Управление модулем ШИМ
13 LINK \l "RDEE" 14RDEE{}15 Чтение из EEPROM
13 LINK \l "READ" 14READ15 Оператор для выгрузки данных в консоль из файла
13 LINK \l "REBOOT" 14REBOOT15 Перезагрузка контроллера
13 LINK \l "REM" 14REM15 Комментарии в программе
13 LINK \l "RENAME" 14RENAME15 Изменяет имя файла
13 LINK \l "RETURN" 14RETURN15 Возврат из подпрограммы
13 LINK \l "RFID" 14RFID{}15 Чтение карты RFID
13 LINK \l "RND_FUN" 14RND{}15 Генерация случайного числа
13 LINK \l "ROL" 14ROL{}15 Сдвиг влево
13 LINK \l "ROR" 14ROR{}15 Сдвиг вправо
13 LINK \l "RROM" 14RROM{}15 Чтение серийного номера 1Wire устройства (33H),например DS1990a или 18В20
13 LINK \l "RTEMP_FUN" 14RTEMP{}15 Получение температуры с датчика DS18B20
13 LINK \l "RUN" 14RUN15 Запуск программы
13 LINK \l "SCOMP_FUN" 14SCOMP{}15 Сравнение двух массивов
13 LINK \l "SCOMPs_FUN" 14SCOMP${}15 Сравнение двух массивов текста
13 LINK \l "SDATE" 14SDATE{}15 Получить дату вида “15-01-18” в текстовую переменную
13 LINK \l "SDT" 14SDT{}15 Получить дату и время вида “12:20:07 15-01-15” в текстовую переменную
13 LINK \l "SEC" 14SEC15 Установка часов – секунды
13 LINK \l "SEC_FUN" 14SEC{}15 Получить текущее время – секунды
13 LINK \l "SEEK" 14SEEK15 Устанавливает текущую позицию чтения или записи в файле.
13 LINK \l "SGET" 14SGET{}15 Ввод данных с UART в массив (RAW)
13 LINK \l "SGET" 14SGET{}15 Запрос числа байт в буфере порта
13 LINK \l "SHTH_FUN" 14SHTH{}15 Получение влажности с датчика SHT
13 LINK \l "SHTT_FUN" 14SHTT{}15 Получение температуры с датчика SHT
13 LINK \l "SIN" 14SIN{}15 Вычисление синуса аргумента в градусах
13 LINK \l "SINPUT" 14SINPUT{}15 Функция ввода числовых, текстовых данных из UART
13 LINK \l "SPRINT" 14SPRINT15 Вывод на печать в UART
13 LINK \l "SPUT" 14SPUT15 Вывод массива в порт UART
13 LINK \l "SQR" 14SQR{}15 Вычисление квадратного корня
13 LINK \l "STATUS" 14STATUS15 Получение данных о состоянии контроллера
13 LINK \l "STEMP" 14STEMP15 Запуск преобразования температуры
13 LINK \l "STIME" 14STIME{}15 Получить время вида “12:20:07” в текстовую переменную
13 LINK \l "STOP" 14STOP15 Остановка выполнения программы
13 LINK \l "TCMP_FUN" 14TCMP{}15 Сравнение времени с текущим в интервале
13 LINK \l "TCPPST_FUN" 14TCPPST{}15 Функция отправки HTTP запроса на сторонний сервер методом POST
13 LINK \l "TCPSND_FUN" 14TCPSND{}15 Функция отправки HTTP запроса на сторонний сервер методом GET
13 LINK \l "THEN" 14THEN15 Конструкция IF THEN – выполнение если истина
13 LINK \l "TIME" 14TIME{}15 Получить время в переменную
13 LINK \l "TIMER" 14TIMER15 Установка таймера
13 LINK \l "TIMER_FUN" 14TIMER{}15 Получить значение таймера
13 LINK \l "TMR" 14TMR15 Установка таймера
13 LINK \l "TMR_fun" 14TMR{}15 Получить значение таймера
13 LINK \l "TMRIRQ" 14TMRIRQ15 Обработчик прерываний по таймеру
13 LINK \l "TO" 14TO15 Оператор цикла – конечное значение счетчика цикла
13 LINK \l "TYPE" 14TYPE15 Выводит содержание файла в консоль, как текст.
13 LINK \l "TYPEB" 14TYPEB15 Выводит содержание файла в консоль, как данные, таблицей в HEX
13 LINK \l "UART" 14UART15 Настройка порта UART
13 LINK \l "UARTIRQ" 14UARTIRQ15 Включение и настройка прерывания от UART
13 LINK \l "UDPSND_FUN" 14UDPSND{}15 Функция отправки UDP пакета
13 LINK \l "VAL_FUN" 14VAL{}15 Преобразование текста в число
13 LINK \l "VER" 14VER15 Показать версию п/о
13 LINK \l "VPRINT" 14VPRINT15 Вывод на печать в текстовую переменную
13 LINK \l "WKEY_FUN" 14WKEY{}15 Ожидание нажатия кнопки/кнопок
13 LINK \l "WKEY1_FUN" 14WKEY{ }15 Ожидание состояния или изменение состояния входов без изменения направления в/в.
13 LINK \l "WREE" 14WREE15 Запись в EEPROM
13 LINK \l "WRITE" 14WRITE15 Оператор для загрузки данных в файл из консоли
13 LINK \l "YEAR" 14YEAR15 Установка календаря – год
13 LINK \l "YEAR_FUN" 14YEAR{}15 Получить текущий год

Операции со стеком
13 LINK \l "VAR_STACK_PLUS" 14§+15 Стек переменных – увеличение указателя
13 LINK \l "VAR_STACK_MINUS" 14§-15 Стек переменных – уменьшение указателя
13 LINK \l "VAR_STACK_CLR" 14§^15 Стек переменных – сброс в начало указателя
13 LINK \l "TXT_STACK_PLUS" 14¤+15 Стек текстовых переменных – увеличение указателя
13 LINK \l "TXT_STACK_MINUS" 14¤-15 Стек текстовых переменных – уменьшение указателя
13 LINK \l "TXT_STACK_CLR" 14¤^15 Стек текстовых переменных – сброс в начало указателя

Настройка контроллера
13 LINK \l "SET_AUTORUN" 14SET_AUTORUN15 Вкл./выкл. автозапуска программы
13 LINK \l "SET_CONSOLE" 14SET_CONSOLE15 Установка порта консоли
13 LINK \l "DG" 14SET DG15 Установка шлюза по умолчанию
13 LINK \l "DHCP" 14SET DHCP15 Вкл /выкл получения адреса по DHCP
13 LINK \l "LGNA" 14SET LGNA15 Установка логина администратора WEB сервера
13 LINK \l "LGNU" 14SET LGNU15 Установка логина пользователя WEB сервера
13 LINK \l "IP" 14SET IP15 Установка IP адреса
13 LINK \l "MASK" 14SET MASK15 Установка маски сети
13 LINK \l "SET_MBADR" 14SET_MBADR15 Установка адреса контроллера в сети MODBUS
13 LINK \l "SET_MBSP" 14SET_MBSP15 Установка скорости первого порта контроллера
13 LINK \l "SET_NAME" 14SET_NAME15 Установка имени контроллера
13 LINK \l "PSWA" 14SET PSWA15 Установка пароля администратора WEB сервера
13 LINK \l "PSWU" 14SET PSWU15 Установка пароля пользователя WEB сервера
13 LINK \l "WEBEXT" 14SET WEBEXT15 Доступ WEB сервера к файлам Flash Disk
13 LINK \l "WEBINT" 14SET WEBINT15 Доступ WEB сервера к внутренним файлам

Отладчик программы на BASIC
13 LINK \l "DEBUG" 14SET DEBUG15 Отладка программы, вывод переменных
13 LINK \l "TRACE" 14SET TRACE15 Отладка , трассировка программы

Функции, операторы, команды - сводная таблица V4.x
Стандартные команды 13 LINK \l "Список_разделов" 14список разделов15



Пример использования
Описание

CLR
13 LINK \l "Список" 14К списку15
Очищает все переменные
CLR
Всем переменным присваивается значение 0, очищаются все стеки. Нельзя применять внутри циклов и подпрограмм.

RUN
13 LINK \l "Список" 14К списку15
Запуск программы
RUN
RUN 10
Очищает все переменные, запускает программу с нулевого или указанного адреса. Доступна только с консоли. Очищаются все стеки. Отключает все прерывания.

STOP
13 LINK \l "Список" 14К списку15
Оператор управления
25 STOP
Останавливает программу в текущей строке. Должен быть единственным или последним в строке (кроме оператора REM, это касаемо и остальных с этими ограничениями).

BREAK
13 LINK \l "Список" 14К списку15
Прерывает выполнение программы
BREAK
Прерывает выполнение программы в текущем месте. Доступна только с консоли и во время выполнения программы.

CONTINUE
13 LINK \l "Список" 14К списку15
Продолжение выполнения
CONTINUE
Продолжает выполнение со следующей строки. Применяется с консоли после остановки оператором STOP, BREAK. Изменить номер строки запуска можно оператором GOTO. Состояние переменных, стеков данных и стеков GOSUB / FOR-NEXT не изменяется.

END
13 LINK \l "Список" 14К списку15
Оператор завершения программы
56 IF Z=0 THEN END :REM Окончание программы
Завершает выполнение программы в текущей строке.
Должен быть единственным или последним в строке

Операторы передачи управления 13 LINK \l "Список_разделов" 14список разделов15




GOTO
13 LINK \l "Список" 14К списку15
Оператор перехода
33 GOTO 100 (-> 100)
33 GOTO +10 (->43)
33 GOTO -5 (->28)
Производится переход на строчку с номером 100. Номер строки может быть представлен переменной. Должен быть единственным или последним в строке (кроме REM).
Для относительного перехода указать смещение со знаком
В командном режиме можно изменить или установить номер строки, с которой будет запущена программа по CONTINUE


GOSUB
13 LINK \l "Список" 14К списку15
Оператор вызова подпрограммы
55 GOSUB 200
55 GOSUB +10
55 GOSUB -5
Производит вызов подпрограммы со строки номером 200 Допускается до 24 вложений. Должен быть единственным или последним в строке (кроме комментариев).
Для относительного перехода указать смещение со знаком

RETURN
13 LINK \l "Список" 14К списку15
Возврат из подпрограммы
100 PRINT X:RETURN
 
Возврат из подпрограммы. Должен быть единственным или последним в строке.


NOERR
13 LINK \l "Список" 14К списку15

Обработчик ошибок
NOERR 1
0000 CLR:NOERR 1:GOTO 200
0001 CLR:PRINT "RESTART":NOERR 1
0002 GOTO 200

0200 REM Start program
В случае ошибки при выполнении программы, управление будет передано строке с номером 1. Как правило, далее потребуется очистка стеков / переменных командой CLR , если ошибка произошла внутри циклов или подпрограмм.
При указании номера равным нулю, функция будет отключена.

Стек и управление стеком 13 LINK \l "Список_разделов" 14список разделов15

§+
13 LINK \l "Список" 14К списку15
Инкремент указателя стека
10 §+
Стек числовых перемеренных. Резервирует запись в стеке. Значение данных в памяти не изменяется. Если стек заполнен полностью, то все значения в стеке циклически сдвигаются к началу. Значение на верхушке стека не изменяется.

§-
13 LINK \l "Список" 14К списку15
Декремент указателя стека
25 §-


30 §-:a=§:§+:§+
Стек числовых перемеренных. Смещает указатель на предыдущую запись. Значение данных в памяти не изменяется
Читает в переменную а предыдущую запись , восстанавливает указатель стека.

§^
13 LINK \l "Список" 14К списку15
Очистка указателя стека
§^
Стек числовых перемеренных. Обнуляет указатель. Стек пуст. Значение данных в памяти не изменяется

¤+
13 LINK \l "Список" 14К списку15
Инкремент указателя стека
10 ¤+
Стек текстовых перемеренных. Резервирует запись в стеке. Значение данных в памяти не изменяется. Если стек заполнен полностью, то все значения в стеке циклически сдвигаются к началу. Значение на верхушке стека не изменяется.

¤-
13 LINK \l "Список" 14К списку15
Декремент указателя стека
10 ¤-
Стек текстовых перемеренных. Смещает указатель на предыдущую запись. Значение данных в памяти не изменяется

¤^
13 LINK \l "Список" 14К списку15
Очистка указателя стека
10 ¤^
Стек текстовых перемеренных. Обнуляет указатель. Стек пуст. Значение данных в памяти не изменяется

GTOP#{}
13 LINK \l "Список" 14К списку15
Получить указатель стека
A= GTOP{}
Переменной присваивается значение указателя стека переменных, 0 если стек пустой.

GTOP${}
13 LINK \l "Список" 14К списку15
Получить указатель текстового стека
A= GTOP${}
Переменной присваивается значение указателя стека текстовых переменных, 0 если стек пустой.

Операторы цикла и сравнения 13 LINK \l "Список_разделов" 14список разделов15


IF THEN
13 LINK \l "Список" 14К списку15

Проверка условия

IF (a>b)&(c

10 IF X<10 THEN X=X+1

20 IF X=5+a THEN GOTO 100
30 IF Z=65 THEN GOSUB 200

IF 5<6 THEN PRINT "A"
IF 5<6 :PRINT "A"
Вычисляется выражение или функция между IF и THEN, которые отделены пробелами.
Если результат положительный и больше нуля то считается истина.
Если результат нулевой или отрицательный то ложь.
Если условие истина, то вычисляется выражение, иначе переход на следующую строку
Если условие истина, то производится переход на строчку с меткой 100, иначе переход на следующую строку
Если условие истина, то производится вызов подпрограммы меткой 200
В условии могут быть числа, переменные, выражения, функции. Слово THEN может быть заменено на двоеточие.

IFELSE THEN
13 LINK \l "Список" 14К списку15
Проверка условия
10 IFELSE 300,X<10 THEN X=X+1

10 IFELSE +50,X<10 THEN X=X+1

Аналогичен конструкции IF THEN, но в случае ЛОЖНОГО результата , переход выполняется на строку, указанную после оператора IFELSE а не на следующую. Само условие или функция записывается через запятую от номера строки перехода, указанного явно. Для относительного перехода указать смещение со знаком. Слово THEN может быть заменено на двоеточие.

FOR TO
NEXT
13 LINK \l "Список" 14К списку15
Оператор цикла
5 FOR I=32 TO 127
6 PRINT $(I);I;”=”;#(I)
7 NEXT I

5 Z=128
10 FOR I=Z-127 TO Z
20 #(I)=I+1
25 PRINT I
30 NEXT I
Производит действие 127-32+1 раз с наращиванием переменной цикла. В качестве действия, вывод переменной как символа с кодом I и вывод значения переменной I как числа . Допускается до 8 вложений. После оператора TO может быть переменная. Переменной цикла может присваиваться число, переменная, результат выражения.
Не допускается GOTO за пределы цикла.
В строке после FOR..TO и NEXT только комментарии.

EXFOR
13 LINK \l "Список" 14К списку15
Принудительный выход из цикла
EXFOR 300

Применяется внутри цикла. Управление будет предано на номер строки, которая должна быть за пределами текущего цикла. В случае вложенных циклов, для каждого цикла – свой выход.
Должен быть последним или единственным в строке.

CASE
13 LINK \l "Список" 14К списку15
Условный переход по списку условий и адресов
CASE A,25,300,26,310



CASE A,25,+10,26,+11
Параметры – имя переменной для сравнения; первое значение с которым сравнивается; номер строки перехода, если равно; второе значение для сравнения; номер строки перехода если равно. Количество ограничено длинной строки. Все значения могут быть числами или переменными.
Если А=25 то переход на строку 300
Если А=26 то переход на строку 310
Если не совпало ни с одним значением переход на следующий оператор в строке или следующую строку.
Для относительного перехода указать смещение со знаком
Должен быть единственным или последним в строке.

Таймеры и задержки 13 LINK \l "Список_разделов" 14список разделов15

TIMER{}
13 LINK \l "Список" 14К списку15
Функция

A=TIMER{x}
Переменной присваивается значение системного таймера с номером X , где X от нуля до семи. Всего 8 независимых таймеров обратного отсчета. Для этих таймеров доступны прерывания.

TIMER
13 LINK \l "Список" 14К списку15
Установка таймера


TIMER x,300
Установка в системный таймер с номером X значения 300, где X от нуля до семи. Каждые 100 mS от этого значения будет отниматься единица, до достижения нулевого значения. Таймер работает в фоновом режиме, независимо от программы пользователя. Максимальное значение 65535. Для этих таймеров доступны прерывания.

TMR{}
13 LINK \l "Список" 14К списку15
Функция

A=TMR{x}
Переменной присваивается значение малого системного таймера с номером X , где X от нуля до семи. Всего 8 независимых таймеров обратного отсчета. Для этих таймеров не доступны прерывания.

TMR
13 LINK \l "Список" 14К списку15
Установка малого таймера


TMR x,200
Установка в малый системный таймер с номером X значения 200, где X от нуля до семи. Каждую секунду от этого значения будет отниматься единица, до достижения нулевого значения. Таймер работает в фоновом режиме, независимо от программы пользователя. Максимальное значение 255. Для этих таймеров не доступны прерывания.

PAUSE
13 LINK \l "Список" 14К списку15
Пауза в миллисекундах
25 PAUSE 10
26 PAUSE Z



10 TIMER 1,200
11 IF TIMER{1}=0 THEN GOTO 13
12 GOTO 11
13
Приостанавливает выполнение программы на указанное число миллисекунд. Максимально до 65535
Не рекомендуется активировать данный оператор со значением более 50 при активном WEB сервере
Используйте тогда следующую конструкцию
FOR §=0 TO 100
PAUSE 10
NEXT § - как пример задержки на 1 секунду
Или используйте таймер при задержках более 2-х секунд с проверкой окончания : (пример на 20 секунд)

TMRIRQ
13 LINK \l "Список" 14К списку15
Обработчик прерываний по таймеру
TMRIRQ x,1250

0048 TMRIRQ 1,100
0049 TIMER 1,50
0050 PRINT A:PAUSE 100
0051 A=A+1:GOTO 50

0100 PRINT "IRQ"
0101 RETURN
В случае срабатывания таймера с номером X (досчитал до нуля), будет вызвана подпрограмма в строке с номером 1250 (аналогично GOSUB), которая обязательно должна заканчиваться оператором RETURN. Занимает 1 позицию в стеке вызова RETURN. Прерывание вызывается один раз в момент перехода счетчика таймера из значения 1 в ноль. При указании номера строки равным нулю, функция будет отключена. Для перезапуска таймера с прерыванием в обработчике прерывания новые установки таймера следует делать непосредственно перед оператором RETURN для исключения рекурсивного вызова и переполнения стека. Или вызвать TMRIRQ с нулевой строкой для отключения.

Математические и логические функции 13 LINK \l "Список_разделов" 14список разделов15

SQR{}
13 LINK \l "Список" 14К списку15
Вычисление квадратного корня
10 A=SQR{x}
20 A=SQR{145}:PRINT A;
Переменной A присваивается значение квадратного корня переменной x. Аргументом функции выступает переменная, число, выражение.

ABC{}
13 LINK \l "Список" 14К списку15
Возвращает абсолютное значение числа
20 T=ABC{ #(25)}
25 S=ABC{X}

Возвращает абсолютное значение числа. Аргументом функции выступает переменная, число, выражение.

ROL{}
13 LINK \l "Список" 14К списку15
Сдвиг влево
10 A=ROL{A,5}
20 A=ROL{B}
A=ROL{25+4,2}
Сдвигает число в переменной влево на указанное число бит, при этом в младший разряд втягиваются нули. По умолчанию сдвигает на 1 бит. Аргументом функции выступает переменная, число, выражение.

ROR{}
13 LINK \l "Список" 14К списку15
Сдвиг вправо
10 A=ROR {A,5}
20 A=ROR {B}
Сдвигает число в переменной вправо на указанное число бит, при этом в старший разряд втягиваются нули. По умолчанию сдвигает на 1 бит Аргументом функции выступает переменная, число, выражение.

RND{}
13 LINK \l "Список" 14К списку15
Случайное число
A=RND{}
Генерация псевдослучайных чисел во всем диапазоне принимающей переменной. Аргументов нет

SIN{}
13 LINK \l "Список" 14К списку15

Вычисление синуса аргумента в градусах
A=SIN{x}
Возвращает значение синуса *1000 аргумента в градусах.

COS{}
13 LINK \l "Список" 14К списку15
Вычисление косинуса аргумента в градусах
A=COS{x}
Возвращает значение косинуса *1000 аргумента в градусах

Операторы ввода вывода 13 LINK \l "Список_разделов" 14список разделов15

PRINT
13 LINK \l "Список" 14К списку15
Оператор вывода.
Вывод на консоль сообщений


PRINT
PRINT ;;
PRINT “Это сообщение”
PRINT X
PRINT $(45);
PRINT ”X= ”,X,”Y= ”,B;
PRINT X,Y,Z;
PRINT .2,A;
PRINT *$(0)
PRINT %2,A;
PRINT ~2,A;












Вывод списка в консоль. Элементы списка разделяются запятой или точкой с запятой. Если точка с запятой, то следующий элемент выводится с табуляцией на 8. Если запятая - то слитно. Табуляция выполняется пробелами.
В случае завершения списка точкой с запятой – строка не переводится. Количество элементов списка от нуля. Сам элемент списка может отсутствовать (табуляция будет выполняться).
В качестве элементов списка выступают:
A-z , § , #3(index) , §A - §Z - переменные, выводятся в виде чисел со знаком без незначащих нулей от - 8 388 608 до + 8 388 607.
#2(index) - переменные, выводятся в виде чисел со знаком без незначащих нулей от -32768 до +32767
#(index) - переменные, выводятся в виде чисел без незначащих нулей от 0 до 255
¤ , ¤A - ¤X - переменные, выводятся в виде чисел без незначащих нулей от 0 до 255 и являются длинной соответствующей строки
@(index) выводятся как HEX запись числа 00-FF.
@2(index) выводятся как HEX запись числа 0000-FFFF.
@3(index) выводятся как HEX запись числа 000000-FFFFFF.
$(index) выводятся как символ с кодом символа в переменной
*$(index) , *¤ , *¤A - *¤X выводится как строка текста с кодами символов в байтах переменной, причем длинна строки записана в первом байте переменной.
“asdf” выводятся как текст. Сам текст заключенный в кавычки.
.X десятичная точка и число – Оператор форматирования вывода обычных переменных, где X =0-7, соответствует количеству знаков после запятой при выводе . 0 – отключает десятичную точку.
%x процент и число - Оператор форматирования длинны числа, где x указывает, сколько последних цифр выводится от написания числа. Значение х=0 – отменяет действие. Диапазон X= 0-3 для индексных и 0-5 для 16 бит и 0-7 для 24 бит.
~y тильда и число - Оператор форматирования , где y указывает, сколько пробелов печатать перед выводом числа, и также наличие его указывает замену незначащих нулей на пробелы. y=0 отменяет действие. Y = 0-12
Операторы форматирования действует от оператора и до конца списка, либо до появления другого этого же типа. Пробелы, указанные внутри кавычек, выводятся.
Длинна буфера вывода - 63 байта для одного элемента списка.

INPUT{}
13 LINK \l "Список" 14К списку15


Функция ввода данных с консоли с ожиданием ввода






A=INPUT {x}
A=INPUT {#(i)}
A=INPUT {#3(i)}


A=INPUT *$(i)


A=INPUT @2(i)
A=INPUT @(i)
Функция ввода данных с консоли с ожиданием ввода.
Окончание ввода ENETR (0x0D).Отключает MODBUS slave на время ввода.
Функция возвращает единицу в случае удачного завершения ввода данных из консоли и ноль в случае не удачи. Например входящие данные нельзя интерпретировать как строку ввода или она пуста или не совпадает тип или размерность входных данных. Списки не поддерживаются. Введенное число или текст помещаются в переменную указанную в фигурных скобках.
Ожидает ввода числа в консоли и присваивает значение переменной.
Ожидает ввода текста в консоли до 63 символов. В ячейку $(i) будет помещено количество введенных символов а в ячейки $(i+1) и далее будет помещен сам текст, до символа 0x0D или до 63 символов.
Ожидает в консоли число в HEX записи 2/4/6 символов. Лишние символы будут отброшены

DATA
13 LINK \l "Список" 14К списку15
Определения блока данных


DATA #(i),255,26,27,5,6
DATA #(i),”Alarm”

DATA #2(i),-800,267,5,6
DATA #3(i),-800,267
Загружает блок данных. Максимальное количество данных в строке определяется длиной строки, которая не должна превышать 64 символа включая номер строки. Максимальное количество строк с данными ограничено только размером свободной памяти программ. Переменной с индексом i присваивается первое число, с индексом i+1 присваивается следующее и т.д. В случае текста присваиваются коды символов, в каждую по одному символу последовательно.

PEEK{}
13 LINK \l "Список" 14К списку15
Чтение GPR/SFR регистра контроллера
A=PEEK{n}



A=PEEK{^n}

Возвращает 8 битное значение прочитанное из GPR/SFR регистра контроллера с указанным адресом n.
Имеет полный доступ к регистрам. Память переменных BASIC отображается на адреса 0x200-0x7FF
Возвращает 8 битное значение прочитанное из внешней EEPROM
по адресу n. Доступно 256к байт. Первые 128к – программа на BASIC, вторые – Flash Disk. Первые 1024 байт Flash Disk – каталог диска.

POKE
13 LINK \l "Список" 14К списку15
Запись GPR/SFR регистра контроллера
POKE n,V







POKE ^n,V
Записывает 8 битное значение V в GPR/SFR регистр контроллера с указанным адресом n.
Имеет полный доступ к регистрам. Память переменных BASIC отображается на адреса 0x200-0x7FF. Запись чего либо в область не совпадающую с пространством переменных может привести к краху системы. Предназначена для профи, знающих внутреннюю архитектуру микроконтроллера. Позволяет совершенно произвольно использовать все возможности контроллера.
Записывает 8 битное значение V во внешнюю EEPROM с указанным адресом n. Доступно 256к байт. Первые 128к – программа на BASIC, вторые – Flash Disk. Первые 1024 байт Flash Disk – каталог диска.

CALL{}
13 LINK \l "Список" 14К списку15
Вызов подпрограммы в машинных кодах
V=CALL{a,B}
Бутлоадер позволяет залить подпрограмму в машинных кодах в верхнюю свободную часть памяти. Вызов этой подпрограммы с указанным адресом a. Подпрограмма должна заканчиваться ассемблерной инструкцией RETURN или RETLW 0xYY. Подпрограмма может вернуть 8-битный результат в WREG микроконтроллера (RETLW 0xYY) и он будет присвоен переменной V. Перед вызовом 8-битное значение B будет помещено в WREG, если указанно. Размеры и адреса свободного места смотреть в документации на текущую прошивку.

ROM
Запись данных в Program Memory
ROM A,#(0)
Запись 64 байт в Program Memory микроконтроллера по адресу A из массива байт с началом в переменной #(0) и до #(63) . Начало данных должно быть выровнено по 64 байта. Например программы в машинных кодах для вызова оператором CALL. Адреса доступной памяти см. в документации на конкретную прошивку.

Операторы и функции работы с EEPROM 13 LINK \l "Список_разделов" 14список разделов15

WREE
13 LINK \l "Список" 14К списку15
Запись в EEPROM
WREE A,#(1)
WREE А,10
WREE A,F
WREE A,#2(1)
WREE A,#3(1)
WREE A,*$(1)


WREE A,#(10),5

WREE A,*$(1),5

Записать переменную или число по адресу А. Адрес должен быть в диапазоне 0-1023. Используется одна или несколько ячеек EEPROM согласно длине переменной.
Адрес записи при много байтовых переменных не должен превышать (1023-длинна переменной).
Дополнительный третий параметр указывает, сколько байт записать, как массив из индексной 8-битной переменной или новую длину текста. Для 16 бит и 24 бит младший байт пишется в младший адрес EEPROM.
При записи числа, указанного явно, используется трехбайтовая запись. При записи строки первым байтом запишется длинна, затем все данные. Если при записи строки явно указать длину, то будет выбрана меньшая длинна, либо из переменной, либо из указанного значения. Максимальная длинна массива для записи в случае индексной переменной – 64 байт.
В случае указания нулевой длинны запись не производится. Если текстовая переменная изначально имеет нулевую длину, то она запишется с нулевой длинной.

RDEE{}
13 LINK \l "Список" 14К списку15
Чтение из EEPROM
#(1)=RDEE {A}
#2(1)=RDEE {A}
F=RDEE {A}
*$(3)= RDEE {A}
*$(3)= RDEE {~5,A}
#(3)= RDEE {~n,A}
Чтение из EEPROM по адресу А. адрес должен быть в диапазоне 0-1023. Используется одна или несколько ячеек EEPROM согласно длине переменной. Адрес при много байтовых переменных не должен превышать (1023-длинна переменной). Дополнительный параметр со знаком тильда ~ указывает, сколько байт читать, как массив из индексной 8-битной переменной или новую длину текста. Для 16 бит и 24 бит младший байт читается из младшего адрес EEPROM. При чтении строки первым байтом читается длинна, затем все данные. Если при чтении строки явно указать длину, то будет выбрана меньшая длинна, либо из прочитанной, либо из указанного значения. Максимальная длинна массива для чтения в случае индексной переменной – 64 байт. Текста - 63 байт самого текста. В случае указания нулевой длинны чтение не производится. Если текстовая переменная изначально имеет нулевую длину, то она и прочитается с нулевой длинной.
Следует следить за типом переменных при записи и чтении из одного адреса. Попытка записи числового массива в стек приведет к записи только одного первого прочитанного элемента.


Операторы и функции работы с часами реального времени 13 LINK \l "Список_разделов" 14список разделов15

Часы реального времени реализованы на микросхеме DS1307. Если не установлены – то некоторые операторы и функции работать не будут. Функции энергозависимых часов будут выполняться. На остальное влияния не оказывает.
Числовые функции

YEAR{}
13 LINK \l "Список" 14К списку15
Функция
A=YEAR{}
Переменной присевается текущий год , две последние цифры (0-99)
Требуется наличие DS1307

MONTH{}
13 LINK \l "Список" 14К списку15
Функция
B=MONTH{}
Переменной присваивается текущий месяц (1-12)
Требуется наличие DS1307

DAY{}
13 LINK \l "Список" 14К списку15
Функция
C=DAY{}
Переменной присваивается текущее число (1-31)
Требуется наличие DS1307

DAYS{}
13 LINK \l "Список" 14К списку15
Функция
C=DAYS{}
Переменной присваивается текущий день недели (1-7)

HOUR{}
13 LINK \l "Список" 14К списку15
Функция
#(i)=HOUR{}
Переменной присваивается текущее значение часа (0-23)

MIN{}
13 LINK \l "Список" 14К списку15
Функция
#(i)=MIN{}
Переменной присваивается текущее значение минут (0-59)

SEC{}
13 LINK \l "Список" 14К списку15
Функция
#(i)=SEC{}
Переменной присваивается текущее значение секунд (0-59)

DATE{}
13 LINK \l "Список" 14К списку15
Функция

#(i)=DATE{}
Переменной с индексом i присваивается текущий год, с индексом i+1 присваивается текущий месяц, с индексом i+2 присваивается текущее число. Требуется наличие DS1307. Далее даты и время можно сравнивать как 24 бит числа #3(i)

TIME{}
13 LINK \l "Список" 14К списку15
Функция
#(i)=TIME{}
Переменной с индексом i присваивается текущий час, с индексом i+1 присваиваются минуты, с индексом i+2 присваиваются секунды.
Далее даты и время можно сравнивать как 24 бит числа #3(i)

TCMP{}
13 LINK \l "Список" 14К списку15
Функция
A=TCMP{#(a), #(b)}
Функция сравнения текущего времени в заданном интервале. Переменной A присваивается 1 в случае текущего времени час:мин:сек в интервале от #(a)-час: #(a+1)-мин: #(a+2)-сек до #(b)-час: #(b+1)-мин: #(b+2) и ноль в противном случае. Если #(b)<#(a) то интервал считается от #(a) до 23:59:59 и от 00:00:00 до #(b)

Текстовые функции

SDATE{}
13 LINK \l "Список" 14К списку15
Оператор
*$(i)=SDATE{}
Текстовой переменной присваиваемся текст формата «15-01-15» содержащий текущую дату. Первый байт по индексу содержит длину текста. Требуется наличие DS1307

STIME{}
13 LINK \l "Список" 14К списку15
Оператор
*$(i)=STIME{}
Текстовой переменной присваиваемся текст формата «12:20:07» содержащий текущее время. Первый байт по индексу содержит длину текста.

SDT{}
13 LINK \l "Список" 14К списку15
Оператор

*$(i)=SDT{}
Текстовой переменной присваиваемся текст формата «12:20:07 15-01-15» содержащий текущее время и дату. Первый байт по индексу содержит длину текста. Требуется наличие DS1307.

Операторы установок

YEAR
13 LINK \l "Список" 14К списку15
Оператор
YEAR 15
Устанавливает год. Параметрами могут быть числа, переменные.
Требуется наличие DS1307

MONTH
13 LINK \l "Список" 14К списку15
Оператор
MONTH 5
Устанавливает месяц
Требуется наличие DS1307

DAY
13 LINK \l "Список" 14К списку15
Оператор
DAY #(5)
Устанавливает день
Требуется наличие DS1307

DAYS
13 LINK \l "Список" 14К списку15
Оператор
DAYS #(5)
Устанавливает день недели (1-7)

HOUR
13 LINK \l "Список" 14К списку15
Оператор
HOUR i
Устанавливает час

MIN
13 LINK \l "Список" 14К списку15
Оператор
MIN 10
Устанавливает минуты

SEC
13 LINK \l "Список" 14К списку15
Оператор
SEC 30
Устанавливает секунды


Группа операторов SET 13 LINK \l "Список_разделов" 14список разделов15
Некоторые команды этого раздела доступны только с консоли.
Предназначены для настройки контроллера и PICµBASIC. Дополнительные операторы этой группы, относящиеся к периферийным модулям, или модулям расширения смотрите в описаниях команд этих модулей.


LGNA
13 LINK \l "Список" 14К списку15

Установка логина администратора WEB сервера

SET LGNA “ADMIN”
В кавычках указывается текст. Вход администратора обеспечивает доступ ко всем функциям. Если логин = “” то аутентификация отключена. Максимальная длинна 8 символов. Чувствительно к регистру.


LGNU
13 LINK \l "Список" 14К списку15

Установка логина пользователя WEB сервера

SET LGNU “USER”
В кавычках указывается текст. Вход пользователя используется для доступа к WEB серверу. Если логин = “” то аутентификация отключена. Максимальная длинна 8 символов. Чувствительно к регистру.

PSWA
13 LINK \l "Список" 14К списку15
Установка пароля администратора WEB сервера
SET PWSA “ADMIN”
В кавычках указывается текст. Максимальная длинна 8 символов. Чувствительно к регистру.

PSWU
13 LINK \l "Список" 14К списку15
Установка пароля пользователя WEB сервера
SET PSWU “USER”
В кавычках указывается текст. Максимальная длинна 8 символов. Чувствительно к регистру.

IP
13 LINK \l "Список" 14К списку15
Установка IP адреса
SET IP 192.168.1.2
Установка IP адреса контроллера


MASK
13 LINK \l "Список" 14К списку15
Установка маски сети, последний октет
SET MASK 128
Установка маски сети 255.255.255.128, три первых октета равны 255.


DG
13 LINK \l "Список" 14К списку15
Установка шлюза по умолчанию, последний октет
SET DG 1
Установка шлюза по умолчанию 192.168.1.1, три первых октета берутся из IP адреса.


DHCP
13 LINK \l "Список" 14К списку15
Вкл /выкл получения адреса по DHCP
SET DHCP ON
SET DHCP OFF
Включает/выключает DHCP клиент. Если включен, то получает адрес по DHCP. Если сервер DHCP не доступен, то используется свои настройки.

NAME
13 LINK \l "Список" 14К списку15
Установка имени контроллера
SET NAME “HOME_PLC”
В кавычках указывается текст. Максимальная длинна 8 символов.

AUTORUN
13 LINK \l "Список" 14К списку15
Вкл /выкл автозапуска программы
SET AUTORUN ON
SET AUTORUN OFF
Автозапуск программы по включения питания со строки с наименьшим номером. Доступна только из консоли.

WEBEXT
13 LINK \l "Список" 14К списку15
Вкл /выкл доступа WEB сервера к файлам Flash Disk
SET WEBEXT ON
SET WEBEXT OFF
Доступ WEB сервера к Flash диску для чтения любых файлов.

WEBINT
13 LINK \l "Список" 14К списку15
Вкл /выкл доступа WEB сервера к внутренним файлам
SET WEBINT ON
SET WEBINT OFF
Доступ WEB сервера к ассоциированным файлам.
Отключение доступа отключает сервер

MBADR
13 LINK \l "Список" 14К списку15
Установка адреса Slave устройства
SET MBADR 16
Устанавливает адрес Device контроллера с сети Modbus
По умолчанию = 16 = 0x10. Допустимые адреса 1-127 кроме 0x0A(10) и 0x0D(13) (коды конца строки и перевода каретки)
Рекомендуется диапазон 16-31 (0x10-0x1F)

MBSP
13 LINK \l "Список" 14К списку15
Установка скорости порта Slave устройства
SET MBSP 0

Устанавливает скорость 1 порта Device контроллера в сети Modbus.
0 = 115200 8N1 - установлена по умолчанию
1 = 19200 8N1
2 = 9600 8N1
После команды установки скорости требуется перезагрузка контроллера.
Переназначение скорости действует на скорость BOOTLOADER

TRACE
13 LINK \l "Список" 14К списку15
Отладка , трассировка
SET TRACE ON
SET TRACE OFF
Вкл/выкл трассировки программы в консоль.
Не сохраняется по выключению питания.

DEBUG
13 LINK \l "Список" 14К списку15
Отладка , вывод переменных
SET DEBUG +a
SET DEBUG +512
SET DEBUG -
Вывод состояния изменений ячейки памяти с указанным адресом. + включает, - выключает отладку
Не сохраняется по выключению питания.

CONSOLE
13 LINK \l "Список" 14К списку15
Установка порта консоли
SET CONSOLE
Выбор потока для консоли
Только при использовании модулей расширения.

LOCK
13 LINK \l "Список" 14К списку15
Блокировка чтения программы
SET LOCK
Блокировка чтения программы. Снимается оператором NEW c одновременным стиранием программы.


Служебные и информационные операторы 13 LINK \l "Список_разделов" 14список разделов15

NEW
13 LINK \l "Список" 14К списку15
Очистить программу
NEW
Стирает текущую программу, форматирует память программ.

COPY
13 LINK \l "Список" 14К списку15
Копирует строку программы
COPY 10,20
Копирует программную строку с номером 10 в строку с номером 20. Предыдущие данные в строке 20 очищаются. Номер строки может быть представлен переменной.

REM
13 LINK \l "Список" 14К списку15
Оператор комментирования
REM Это комментарий
 20 REM GOTO 100
Комментарий, интерпретатор не исполняет стоку следующую за REM. Пример : исключение оператора GOTO, строчка превращается в комментарий

LIST
LISt
13 LINK \l "Список" 14К списку15

Оператор
LIST
LIST 10,100

LIST 20

LISt 20

Выводит листинг всей программы.
Выводит листинг со строки 10 по строку 100 включительно.
Выводит листинг со строки 20.
Доступен только из консоли. Номер строки (строк) должен быть указан числом. Должен быть последним в строке.
Специальный вывод с замедлением, для медленных компьютеров и др. устройств

LERR
13 LINK \l "Список" 14К списку15
Оператор
Last ERROR
LERR
Показывает последнюю ошибку в консоль. Обычно при использовании оператора NOEER программа продолжит работу после ошибки, но требуется узнать, была ли, и какая ошибка в процессе выполнения программы.
Или узнать тип и место последней ошибки.

VER
13 LINK \l "Список" 14К списку15
Оператор
VER
Показывает версию П/О BASIC в консоль

BOOT
13 LINK \l "Список" 14К списку15
Оператор
BOOT
Отмена инсталляции BASIC и запуск бутлоадера*
Подготовка к обновлению прошивки PICuBASIC. Не сбрасывает программу пользователя и регистрацию PICuBASIC. Выполняется только в консоли.

REBOOT
13 LINK \l "Список" 14К списку15
Оператор
REBOOT
Перезагрузка контроллера

STATUS
13 LINK \l "Список" 14К списку15
Оператор
STATUS
Получение данных о состоянии контроллера. Выполняется только в консоли.

CODE
13 LINK \l "Список" 14К списку15
Оператор
CODE “1234-5678”
Ввод кода.

Операторы и функции работы со строками 13 LINK \l "Список_разделов" 14список разделов15

SCOMP{}
13 LINK \l "Список" 14К списку15
Функция
Сравнение двух массивов


A=SCOMP{#(i),#(k),5}
Возвращает 1 в случае совпадения или 0 при не совпадении. Сравниваются два массива #(i) и #(k) длинной каждый 5 байт. Источником массива данных могут быть только индексные переменные длинной до 128 байт. Возвращает 1 в случае нулевой длинны. Если текстовые переменные в верхушке стека, стек не понижается.

SCOMP${}
13 LINK \l "Список" 14К списку15
Функция
Сравнение двух массивов текста


A=SCOMP${*$(i),*$(k)}
Возвращает 1 в случае совпадения или 0 при не совпадении. Сравниваются два массива с началом $(i) и $(k) длинной $(i) байт от $(i+1) до $(i+$(i)) и от $(k+1) до $(k+$(i)) соответственно. Возвращает 1 в случае нулевой длинны и 0 в случае если вторая переменная короче первой. Максимальная длина 128 байт. Если текстовые переменные в верхушке стека, стек не понижается.

INSTR${}
13 LINK \l "Список" 14К списку15
Функция
Поиск вхождения строки
A=INSTR${*$(i),”OK”}
Осуществляет в переменной $(i), интерпретированной как строка текста, поиск вхождения подстроки заданной явно или строковой переменной. Возвращает 0 если не найдено или номер символа с которого найдено совпадение Если текстовые переменные в верхушке стека, стек не понижается.

VAL{}
13 LINK \l "Список" 14К списку15
Функция
Преобразование текста в число
A=VAL{*$(5),2,5}
#(15)=VAL{*$(5),2}
#2(15)=VAL{*$(5),2}
#3(15)=VAL{*$(5),2}


#(5)=VAL{@*$(5),2}

Функция возвращает число из текста взятого у текстовой переменной $(5) с позиции 2, длинной 5 символов или до
символа разделителя(пробел, запятая, конец строки...) если параметр длинны отсутствует. Длинна текста для преобразования не должна превышать 7 байт для чисел.
Допустимые символы 0-9
В переменную #(5) помещает число из текста взятого у текстовой переменной $(5) с позиции 2 длинной 2 символа, как HEX запись 8 бит. Допустимые символы 0-9, A-F.
Если данные нельзя интерпретировать как число, возвращает нулевое значение. В этом случае длинна чтения всегда символа.

MID${}
13 LINK \l "Список" 14К списку15
Оператор подстроки

*$(5)=MID${*$(50),5,2}
В текстовую переменную $(5) помещает символы взятые у текстовой переменной $(50) с позиции 5 длинной 2 символа. Запись согласно правилам текстовых переменных. Если переменные в стеке, то в теле функции извлекается, результат добавляется.

VPRINT
13 LINK \l "Список" 14К списку15
Оператор вывода
Приемником является индексная переменная.
VPRINT *$(10) ”X= ”,X, ”Y= ”,B

Виртуальный вывод. Полностью аналогичен оператору PRINT. Все выводимые данные помещаются в указанную текстовую переменную. Первый байт будет содержать длину данных.
Сама переменная от списка вывода отделена пробелом, суммарное количество символов не должно превышать 63

CRCM{}
13 LINK \l "Список" 14К списку15
Проверка CRC16
A=CRCM{*$(10)}
Проверка 16 бит контрольной суммы в формате MODBUS для текстовой переменной, содержащей полный пакет данных
Возвращает 1 в случае совпадения, 0 в случае не совпадения
В первой ячейке $(10) длинна пакета, в остальных сам пакет. Если переменная в верхушке стека, стек не понижается.

CRCM
13 LINK \l "Список" 14К списку15
Генерация CRC16
CRCM *$(10)
Генерирует и дописывает в конец 16 бит контрольную сумму в формате MODBUS для текстовой переменной, содержащей полный пакет данных без контрольной суммы. Не выполняет добавление, в случае нулевой длинны. Если переменная в верхушке стека, стек не повышается.

CRCD{}
13 LINK \l "Список" 14К списку15
Проверка CRC8
A=CRCD{*$(10)}
Проверка 8 бит контрольной суммы в формате DALLAS для текстовой переменной, содержащей полный пакет данных
Возвращает 1 в случае совпадения, 0 в случае не совпадения. Если переменная в верхушке стека, стек не понижается.

CRCD
13 LINK \l "Список" 14К списку15
Генерация CRC8
CRCD *$(10)
Генерирует и дописывает в конец 8 бит контрольную сумму в формате DALLAS для текстовой переменной, содержащей полный пакет данных без контрольной суммы. Не выполняет добавление, в случае нулевой длинны. Если переменная в верхушке стека, стек не повышается.


Операторы и функции работы с портами ввода – вывода 13 LINK \l "Список_разделов" 14список разделов15

PORT{}
13 LINK \l "Список" 14К списку15
Получение состояния дискретного порта


#(i)=PORT{A}
Порт ввода/вывода настраивается на ввод
Переменой присваивается 1 если состояние порта ввода/вывода с номером A =лог.1 или 0 если лог.0 Номера портов от 1 до 34. По включению порты настроены на ввод. Опрос производится в момент выполнения функции. Если требуется узнать изменения за прошедший период – используйте функцию GKEY

PORT*{}
13 LINK \l "Список" 14К списку15
Опрос состояния дискретного порта


#(i)=PORT*{A}
Опрос порта без изменения направления ввода-вывода.
Переменой присваивается 1 если состояние порта ввода/вывода с номером A =лог.1 или 0 если лог.0 Номера портов от 1 до 34. По включению порты настроены на ввод. Опрос производится в момент выполнения функции. Если требуется узнать изменения за прошедший период – используйте функцию GKEY

PORT
13 LINK \l "Список" 14К списку15
Установка дискретного порта

PORT A,i
Порт ввода/вывода с номером А настраивается на вывод, и устанавливается в ноль, если i=0;
в единицу, если i=1;меняет свое состояние на противоположное , если i=2.

IOIRQ
13 LINK \l "Список" 14К списку15
Установка и настройка прерываний от портов ввода/вывода
IOIRQ N,YYYY
Включение и настройка прерываний от портов IO.
N – номер порта: 1=I/O3; 2=I/O4; 3=I/O12; 4=I/O13;
YYYY - номер строки вызова подпрограммы по прерыванию. Если номер строки перехода по прерыванию YYYY = 0 то прерывание отключается. Если не равен и более нуля – включается.
Источником прерывания является любое изменение уровня по сравнению с тем, когда прерывание было активировано оператором IOIRQ. Так если оператор был вызван при состоянии порта =0 то прерывание выполнится при изменении состояния из 0 в 1. Для возникновения достаточно удержания порта в новом состоянии не менее 1 миллисекунды, даже если потом состояние порта вернется к предыдущему. При выполнении условий прерывание дожидается выполнения текущей строки программы и вызывает подпрограмму с адреса YYYY, которая должна заканчиваться оператором RETURN. В момент вызова само прерывание отключается (YYYY=0). Для повторного применения в конце подпрограммы, перед оператором RETURN, в одной строке, требуется повторное включение.

PWM1
PWM2
PWM3
PWM4
PWM5
13 LINK \l "Список" 14К списку15
Управление модулем ШИМ


PWM1 1,#(I)

PWM3 1,50
Включение и настройка модуля PWM, установка заполнения.
Первый параметр 0 – PWM выключен, настроен на ввод , 1- включен, частота 2543 Гц, 2 – частота 10172 Гц, 3-частота 40690 Гц.
Второй параметр – заполнение ШИМ 0-255 .
PWM1 – 1 канал, PWM2 – 2 канал, и т.д.
Каналы разбиты на 2 группы по частоте. Первая - 1и 2.
Вторая 3,4,5. Частота в одной группе одинаковая и выбирается последним оператором. При использовании RFID первая группа отключена.При использовании генератора – отключается вторая группа.

ADC{}
13 LINK \l "Список" 14К списку15
Чтение результата преобразования АЦП
A=ADC{n}
#(i)= ADC{2}
Настраивает выбранный канал АЦП как аналоговые входы АЦП. Читает значение с выбранного канала АЦП в переменную. Выходное число 0-1023 для напряжения от нуля до +5(+3,3) вольт. Номера каналов 1-4
Для отключения модуля АЦП и аналоговых входов нужно указать номер канала равный нулю. При этом порты, ранее занятые АЦП будут настроены на ввод.

BEEP
13 LINK \l "Список" 14К списку15
Генерация звука
BEEP C,D
Генерация звука с номером ноты = С, длительностью =D. Длительность кратно 25 Ms. Номера нот 1-31 от До первой октавы до Ми пятой октавы.

GCLK{}
13 LINK \l "Список" 14К списку15

Счетчик импульсов
A=GCLK{x}
Счетчик импульсов за 1 mS, 10 mS, 100 mS, 1000 mS для x= 1,2,3,4 соответственно
При переполнении - возвращается отрицательное число
- 32768. Не применим для индексных переменных.
Максимальная частота измерения - 9,4 МГц

CLK1
CLK2
CLK3
13 LINK \l "Список" 14К списку15

Генератор частоты (меандр) на выводе CCPx 2.5 кГц - 5,2 МГц
CLK1 y,x
CLK2 y,x
CLK3 y,x
Включает генератор частоты От 2.5 кГц до 5,2 МГц . Отключает PWM. Генератор работает независимо и постоянно от момента включения.
Диапазон частот разбит на 3 диапазона Y=0,1,2,3
0 – выключен, порт настраивается на ввод
В каждом 128 частот. Х = 0-127
1 диапазон, частота = 10416666/(2x+2)
2 диапазон, частота = 2604167/(2x+2)
3 диапазон, частота = 651041,7/(2x+2)



Операторы и функции работы с дискретными входами 13 LINK \l "Список_разделов" 14список разделов15

GKEY{}
13 LINK \l "Список" 14К списку15
Опрос входов без изменения направления ввода-вывода.

A=GKEY{c,e,b}
Где b- битовая маска опроса, с- тип опроса, e – номер канала.
Необходимые порты должны быть ранее настроены на ввод .
Канал 1: I/O 1-I/O15. Канал 2: I/O 16-I/O30. Канал 3: I/O 31-I/O34.
Битовая маска – если например b=5 (2^0*1 +2^1*0 + 2^2*1+2^3*0.) то опрашиваются входа I/O 1 и I/O 3 для 1 канала. b=1-32767
Тип опроса.
- Если с=0 то опрос производится в момент вызова функции.
В переменную записывается текущее состояние входов. Выходные данные – если на входе высокий уровень то соответствующий бит будет установлен в единицу и наоборот. Например I/O 1 =0 и I/O 3 =1 , вызов A=GKEY{0,1,5} даст значение А=4.
- Если с=1 то переменной А присваивается битовое значение номера входа, на котором было изменение состояния от момента предыдущего вызова GKEY или WKEY. Текущее состояние берется базой состояния для следующего вызова GKEY . Опрос входов производится в фоновом режиме.
Например было изменение на входах 1,3,4 и маска =5 тогда A = 5
Минимальное время изменения для регистрации – более 1mS
Также можно применять функции и операторы PORT, см. описание в стандартных командах.

WKEY{}
13 LINK \l "Список" 14К списку15
Ожидание указанного состояния или изменение состояния входов без изменения направления ввода-вывода.





A=WKEY{c,e,b}
Ожидает изменения состояния порта и присваивает значение переменной.
Выход - изменение или BREAK в консоли.
Необходимые порты должны быть ранее настроены на ввод .
Где b- битовая маска опроса, с- тип опроса, e – номер канала.
Переменной А присваивается битовое значение номера входа, на котором было изменение состояния.
Если с=0 – ожидается появление логического нуля на любом входе, определенным маской. Если на момент вызова уже 0 присутствует, то сразу присваивается значение.
Если с=1 – ожидается появление логической единицы на любом входе, определенным маской. Если на момент вызова уже 1 присутствует, то сразу присваивается значение.
Если с=2 – ожидается изменение состояния на любом входе, определенным маской. Изменением считается изменение состояния после вызова функции. Также можно применять функции и операторы PORT, см. описание в стандартных командах.



Операторы и функции работы с кнопками. 13 LINK \l "Список_разделов" 14список разделов15
Требуется подключение дисплея.
GKEY{}
13 LINK \l "Список" 14К списку15
Опрос кнопки/кнопок

A=GKEY{}
В переменную записывается текущее состояние кнопок. 0- не нажата. Нажата первая- добавляется 1, вторая -2, третья -4,четвертая -8, пятая -16. Например 5 соответствует нажатой 1 и3 кнопки

WKEY{}
13 LINK \l "Список" 14К списку15
Ожидание нажатия кнопки/кнопок
#(i)=WKEY{}
Ожидает нажатия любой кнопки и присваивает значение переменной. Выход - нажатие кнопки или BREAK в консоли

KEY{}
13 LINK \l "Список" 14К списку15
Получить код кнопки/кнопок


A=KEY{15}

Ожидает отпускания всех кнопок, затем ожидает нажатия любой кнопки указанное время в секундах (max=255) и присваивает значение переменной. Возвращает код кнопки, или в 0 в случае таймаута (не нажата). Время может быть указанно переменной, числом, выражением.

KEYIRQ
13 LINK \l "Список" 14К списку15
Включение и настройка прерывания от кнопок
KEYIRQ YYYY


Если номер строки перехода по прерыванию YYYY = 0 то прерывание отключается. Если не равен и более нуля – включается. Источником прерывания является нажатие любой кнопки. При выполнении условий прерывание дожидается выполнения текущей строки программы и вызывает подпрограмму с адреса YYYY, которая должна заканчиваться оператором RETURN. В момент вызова само прерывание отключается (YYYY=0). Для повторного применения в конце подпрограммы, перед оператором RETURN, в одной строке, требуется повторное включение.



Операторы и функции работы с периферийными модулями 1-Wire 13 LINK \l "Список_разделов" 14список разделов15

RROM{}
13 LINK \l "Список" 14К списку15

Чтение серийного номера 1Wire устройства (33H),например DS1990a или 18В20
A=RROM{1,#(i)}
A=RROM{2,#(i)}

Возвращает 0 в случае ошибки и 1 в случае успешного чтения.
Если чтение удачно то переменным с индексами от i+0 до i+7 присваиваются код устройства - 8 байт Если нет – то не изменяются.
Выполняется примерно 10 ms. Параметром выступает номер интерфейса.

RTEMP{}
13 LINK \l "Список" 14К списку15
Функция

Получение температуры с датчика DS18B20

T=RTEMP{1}

T=RTEMP{2, # (i)}
Переменной T присваивается значение температуры со знаком или значение -32768 в случае ошибки/отсутствия датчика. Первым параметром выступает номер интерфейса, вторым параметром может выступать серийный номер датчика -8 байт в переменных от i до i+7 для нескольких датчиков на одной шине. Может отсутствовать. *Выполняется примерно 800 Ms. Производится запуск преобразования для всех датчиков, ожидание, получение данных. Результат - температура с точностью 0,1 градуса. Например полученное значение 125 – это температура 12,5 градуса.

STEMP
13 LINK \l "Список" 14К списку15
Оператор
STEMP 1
STEMP A
Запуск преобразования температуры для всех датчиков в указанном канале.

GTEMP{}
13 LINK \l "Список" 14К списку15

Функция

Чтение температуры с датчика DS18B20


T=GTEMP{1}

T=GTEMP{2,#(i)}
Переменной T присваивается значение температуры со знаком или значение -32768 в случае ошибки/отсутствия датчика. Первым параметром выступает номер интерфейса, вторым параметром может выступать серийный номер датчика -8 байт в переменных от i до i+7 для нескольких датчиков на одной шине. Может отсутствовать.
Производится только чтение данных. Ране должна быть выполнена команда STEMP с разницей во времени не менее 800 mS. Результат - температура с точностью 0,1 градуса. Например, полученное значение -34– это температура -3,4 градуса.


Операторы и функции работы с периферийными модулями - AM2302 /DHT22 13 LINK \l "Список_разделов" 14список разделов15

GDHTT{}
13 LINK \l "Список" 14К списку15
Получение температуры с датчика DHT22


T=GDHTT{}
Переменной присваивается значение температуры с датчика DHT22 в градусах Цельсия. Результат - температура с точностью 0,1 градуса. Например полученное значение 125 – это температура 12,5 градуса. В случае ошибки/отсутствия датчика - значение -32768/- 8 388 608.

GDHTH{}
13 LINK \l "Список" 14К списку15
Получение влажности с датчика DHT22


H=GDHTH{}
Переменной присваивается значение влажности с датчика DHT22 в процентах. Результат - влажность с точностью 0,1 процента. Например полученное значение 525 – это температура 52,5 процента. В случае ошибки/отсутствия датчика - значение -32768/- 8 388 608.


Операторы и функции работы с дисплеем HD44780 13 LINK \l "Список_разделов" 14список разделов15

CLS
13 LINK \l "Список" 14К списку15
Очистка экрана дисплея
20 CLS
Очистка экрана дисплея. Курсор устанавливается на 0 позицию.

AT
13 LINK \l "Список" 14К списку15
Установка курсора
AT 10
Установка курсора на позицию 10. Нумерация с нуля. Адреса знакомест для дисплея 2*16 начинаются с 0 для 1 строки и с 64 для второй. Параметрами выступают переменная, число.
Для графического - устанавливает адрес в пикселях и номер строки вывода

LCDD
13 LINK \l "Список" 14К списку15
Послать данные в дисплей
20 LCDD $(5)
Записывает в дисплей значение переменной в регистр данных без перекодировок. Параметрами выступают переменная, число. Коды русских букв не совпадают в дисплее, подробнее смотрите в документации на дисплей HD44780. Для графического записывает 8 точек по вертикали в текущей строке и текущем адресе.

LCDC
13 LINK \l "Список" 14К списку15
Послать команду в дисплей
20 LCDC #(3)
Записывает в дисплей значение переменной в регистр команд. Подробнее смотрите в документации на дисплей HD44780. Например включить курсор – 14.
Для графического только 0/1 - включение инверсии вывода текста.

LPRINT
13 LINK \l "Список" 14К списку15
Оператор вывода.
Вывод на ЖКИ сообщений

LPRINT “Это сообщение”
LPRINT X
LPRINT $(45)
LPRINT ”X= ”,X,”Y= ”,Y
LPRINT X,Y,Z
LPRINT #2,A
Полностью аналогичен оператору PRINT
Перевод строки - не поддерживается. Используйте оператор AT.

LINIT
13 LINK \l "Список" 14К списку15
Включение и инициализация дисплея
LINIT X,y,z
X=0 - OFF ; X=1 - HD44780 ; X=2 - UC6101s, значение контрастности , режима ориентации. При нулевых значениях - устанавливаются по умолчанию.


Операторы и функции работы с дисплеем UC1601s 13 LINK \l "Список_разделов" 14список разделов15

CLS
13 LINK \l "Список" 14К списку15
Очистка экрана дисплея
20 CLS
Очистка экрана дисплея. Курсор устанавливается на 0 позицию.

AT
13 LINK \l "Список" 14К списку15
Установка текстового курсора
AT 10,2,0
Управление текстовым курсором
Устанавливает адрес с начала строки в пикселях и номер строки вывода. Управляет обычный=0 или инверсный вывод = 1, если третий операнд отсутствует, значение инверсии не меняется.

LCDD
13 LINK \l "Список" 14К списку15
Послать данные в дисплей
20 LCDD $(5)
Записывает в дисплей значение переменной в регистр данных без перекодировок. Параметрами выступают переменная, число. Записывает 8 точек по вертикали в текущей строке и текущем адресе. Младший бит сверху.
Инкремент адреса в строке. Предназначен для вывода картинок из RAW массива, файла.

LCDC
13 LINK \l "Список" 14К списку15
Послать команду в дисплей
20 LCDC #(3)
Записывает в дисплей значение переменной в регистр команд. См. документацию на UC1601s

LPRINT
13 LINK \l "Список" 14К списку15
Оператор вывода.
Вывод на ЖКИ сообщений

LPRINT “Это сообщение”
LPRINT X
LPRINT $(45)
LPRINT ”X= ”,X,”Y= ”,Y
LPRINT X,Y,Z
LPRINT #2,A
Полностью аналогичен оператору PRINT
Перевод строки - не поддерживается. Используйте оператор AT.

LINIT
13 LINK \l "Список" 14К списку15
Включение и инициализация дисплея
LINIT X,y,z
X=0 - OFF ; X=1 - HD44780 ; X=2 - UC6101s, режима ориентации MODE = 0-3, значение контрастности 0-15. При нулевых значениях - устанавливаются по умолчанию.

POINT
13 LINK \l "Список" 14К списку15
Установка графического курсора, сброс/ установка/ инверсия
пикселя
POINT X,Y,z
Устанавливает графический курсор в координаты X,Y.
z=0 – очистка пикселя. (x = 0-131, y = 0-63)
z=1 – установка пикселя.
z=2 – инверсия пикселя.
z отсутствует – только установка курсора

DRAW
13 LINK \l "Список" 14К списку15
Рисование линий
DRAW X,Y,z
Рисует линию от текущих координат до координат X,Y.
z=0 – очистка пикселей в линии. (x = 0-131, y = 0-63)
z=1 – установка пикселей в линии.
z=2 – инверсия пикселей в линии.


Операторы и функции работы с периферийными модулями - USART, RS485 13 LINK \l "Список_разделов" 14список разделов15

UART
13 LINK \l "Список" 14К списку15
Настройка порта UART
UART 1,S
UART 2 1,S


UART 3 1
UART 3 0

Включает/выключает порт RS232/485 и настраивает скорость. Первый параметр-номер порта. Это не обязательный параметр, отделенный пробелом. По умолчанию выводится во второй аппаратный порт. Второй параметр - тип: 0 – порт отключен.1 – включен в режиме RS232.2 – включен в режиме RS485. Третий - скорость порта: 1-1200 8N1, 2-2400 8N1, 3-4800 8N1, 4-9600 8N1, 5-19200 8N1, 6-38400 8N1, 7-115200 8N1. По умолчанию выводится во второй аппаратный порт. Номер порта указывается числом 2 или 3. Для третьего порта скорость не выбирается и фиксирована 9600. Первый порт (консоль / MODBUS ) настраивается командами SET




SPRINT
13 LINK \l "Список" 14К списку15
Оператор вывода.
Вывод в порт RS232 или RS485

SPRINT 2 X,Y,Z;
SPRINT 3 “сообщение”
SPRINT ”X= ”;X;”Y= ”;B;
SPRINT X,Y,Z;
Полностью аналогичен оператору PRINT
Перевод строки - вывод двух символов с кодами 0x0D и 0x0A.
Дополнительно перед списком вывода можно указать номер порта вывода числом 1,2,3 которое отделено от списка пробелом. По умолчанию выводится во второй аппаратный порт. Номер 1 соответствует порту консоли. Номер 3 соответствует дополнительному порту. Номер порта указывается числом 1-3.








SINPUT{}
13 LINK \l "Список" 14К списку15






Функция ввода числовых, текстовых данных

Окончание ввода – символ 0x0D(Enter).
Символ 0x0А(LF) игнорируется.











A=SINPUT{2,x}
A=SINPUT{#3(i)}



A=SINPUT{2,*$(i)}




A=SINPUT{2,@2(i)}

Функция ввода числовых, текстовых данных из последовательного порта. Функция возвращает единицу в случае удачного завершения ввода данных и ноль в случае не удачи. Например входящие данные нельзя интерпретировать как строку ввода или она пуста или не совпадает тип или размерность входных данных. Списки не поддерживаются. Введенное число или текст помещаются в переменную указанную в фигурных скобках. Первый параметр-номер порта. Это не обязательный параметр, отделенный запятой. По умолчанию используется второй аппаратный порт.
Ожидает ввода числа текстом в порту RS232/RS485 и присваивает переменной. Преобразуется текст с начала строки и до 0x0D или символа разделителя(не цифра). Окончание ввода – символ 0x0D(Enter). Выход – ввод данных или BREAK в консоли.
Ожидает ввода текста в порту RS232/RS485 до 63 символов. Окончание ввода – символ 0x0D(Enter). В ячейку $(i) будет помещено количество введенных символов а в ячейки $(i+1) и далее (+2,+3)будет помещен сам текст, включая символ 0x0D.
Ожидает ввода числа как HEX записи текстом, длинной согласно размерности переменной. Лишние символы будут отброшены.
Если порт не активирован – то прерывание по ошибке.
Номер порта указывается числом 1-3.









SGET{}
13 LINK \l "Список" 14К списку15





Ввод данных с UART в массив (RAW)
Запрос числа байт в буфере порта















A=SGET{1,*$(i)}
A=SGET{*$(i)}
A=SGET{1}
A=SGET{}
Функция возвращает число прочитанных байт или число байт в приемном буфере последовательного порта.
Первый параметр, не обязательный – номер порта. Задается числом 1,2,3.
Второй параметр имя тестовой переменной, куда будут записаны символы из входного буфера. Если не указан – чтение не производится и функция вернет только количество байт в буфере.
Ввод массива данных из входного буфера порта RS232/RS485 до 64 байт без ожидания (то что там есть на текущий момент вне зависимости от наличия 0x0D). В ячейку $(i) будет помещено количество введенных байт, а в ячейки $(i+1) и далее (+2,+3) будет помещены байты из входящего потока без каких либо интерпретаций, как есть. После ввода входящий буфер очищается. Приемником массива данных могут быть только текстовые переменные. По умолчанию используется второй аппаратный порт. Размер буфера 64 байт для 1 и 2 порта, 32 для третьего. Буфер кольцевой. 65 принятый байт заменит первый и число байт станет равным 1.


SPUT
13 LINK \l "Список" 14К списку15

Вывод массива в порт UART

SPUT 2 #(i)
SPUT $(i)
Ввод массива данных из переменной #(i) в порт RS232/RS485 до 63 байт, как есть. Количество данных - в ячейке #(i), не выводится. Сами данные в ячейках #(i+1) и далее (+2,+3).
Первый параметр-номер порта. Это не обязательный параметр, отделенный пробелом. По умолчанию используется второй аппаратный порт. Номер порта указывается числом 1-3.

UARTIRQ
13 LINK \l "Список" 14К списку15
Включение и настройка прерывания от UART
UARTIRQ N,XX,YYYY

10 UARTIRQ 2,0,100:REM IRQ on
.
100 *$(0)=SGET{}
101 X=VAL{*$(0),1}:PRINT X
102 UARTIRQ 2,0,100:RETURN
Если номер строки перехода по прерыванию YYYY = 0 то прерывание отключается. Если не равен и более нуля – включается. Всего два вектора прерывания – от порта с номером N=2 и с номером N=3. Источником прерывания может быть получение в порт заданного количества символов XX или получение кода конца строки 0x0D если XX=0. При выполнении условий в порту прерывание дожидается выполнения текущей строки программы и вызывает подпрограмму с адреса YYYY, которая должна заканчиваться оператором RETURN. В момент вызова само прерывание отключается (YYYY=0). Для повторного применения в конце подпрограммы, перед оператором RETURN, в одной строке, требуется повторное включение.

Операторы и функции работы с периферийными модулями - RFID 13 LINK \l "Список_разделов" 14список разделов15

RFID{}
13 LINK \l "Список" 14К списку15
Чтение карты RFID


A=RFID{1,#(i)}

A=RFID{b,#(10)}
Возвращает значение «1» в случае обнаружения карты RFID EM marine и «0» в случае отсутствия карты. Если карта есть то переменным с индексами от i+0 до i+4 присваиваются код карты - 5 байт. Если нет – то не изменяются. Выполняется примерно 150 mS. В качестве параметра выступает номер канала чтения 1 или 2.
При использовании отключен PWM1 .
Номер канала равный нулю отключает считыватель.



Операторы и функции работы с Flash disk 13 LINK \l "Список_разделов" 14список разделов15
Встроенная файловая система
DIR
13 LINK \l "Список" 14К списку15
Оператор
DIR
DIr
Вывод в консоль каталога файлов Flash диска
Вывод в консоль каталога файлов Flash диска включая удаленные.

DIR{}
13 LINK \l "Список" 14К списку15
Проверка существования файла
A=DIR{*$(10)}
A=DIR{“LOG.txt”}
Возвращает единицу в обычную переменную, если такой файл существует или ноль, если нет.

DIRF{}
13 LINK \l "Список" 14К списку15
Получить имя файла
*$(10)= DIRF{}



*$(10)= DIRF{0}
Записывает имя первого файла на диске в индексную переменную как текст (первый байт – длинна текста). Следующий вызов – второго, и так до конца каталога. Если файлов более нет, вернет пустую строку. Следующий вызов – снова первый.
Параметр 0 указывает, что читать требуется с начала каталога, или с указанного номера. Нумерация с нуля.

FORMAT
13 LINK \l "Список" 14К списку15
Оператор
FORMAT
Форматирует Flash диск. Физически удаляет все данные и создает пустой каталог.

FOPEN
13 LINK \l "Список" 14К списку15
Оператор
FOPEN ”README. TXT”,R
FOPEN ”REPORT.
TXT”,W
FOPEN *$(i),W
FOPEN *$(10),RW

FOPEN *$(i),WN

Открывает файл на чтение. Указатель устанавливается на первый символ файла.
Открывает файл на запись. Указатель устанавливается на первый символ файла. Если файл не существует – он будет создан, каталог обновится при закрытии файла.
Открывает файл на чтение / запись.
Если файл существует при открытии на запись, то он открывается для циклической записи. Указатель устанавливается на первый символ файла. В дальнейшем запись сдвигает указатель на число записанных байт. При достижении конца файла указатель устанавливается на начало. Идеально подходит для сохранения истории, лог файлов и др. Запись в реальном времени, отключение питания при открытом файле не приводит к порче содержимого.
Открывает файл на запись как новый, если такой файл существует, то он будет удален с дефрагментацией.

CLOSE
13 LINK \l "Список" 14К списку15
Оператор
CLOSE
Закрывает файл, ранее открытый для чтения или записи.
Если файл был открыт для потоковой записи – вычисляет его длину, обновляет каталог. Если файл был не закрыт при потоковой записи и пропало питание – данные не сохранятся. Используйте циклическую запись в существующий файл.

CREATE
13 LINK \l "Список" 14К списку15
Оператор
CREATE 32,2048,“log.txt”
Создаёт файл log.txt длинной 2048 байт, заполняет его. Максимальная длинна 32767 байт. Первое число(переменная) – код символа заполнителя. Второе число(переменная) – длинна файла в байтах.
В дальнейшем может быть открыт для циклической записи/чтения.

TYPE
13 LINK \l "Список" 14К списку15
Оператор
TYPE “README.TXT”
TYPE *$(0)
Выводит содержание файла в консоль, как текст.


TYPEB
13 LINK \l "Список" 14К списку15
Оператор
TYPEB “LOG.TXT”
TYPEB *$(0)
TYPEB *131072
Выводит содержание файла в консоль, как данные, таблицей в hex

Просмотр 1кб с любого указанного адреса внешней EEPROM

DEL
13 LINK \l "Список" 14К списку15

Оператор
DEL “README.TXT”
DEL *$(i)
Удаляет файл с указанным именем, выполняет дефрагментацию диска. Не применять для систем с нестабильным питанием. Отключения питания в процессе приведет к разрушению файловой системы

DELF
13 LINK \l "Список" 14К списку15

Оператор
DELF “README.TXT”
DELF *$(i)
Удаляет файл с указанным именем. Место не освобождается на диске, кроме как удаление последнего файла

DEFRAG
13 LINK \l "Список" 14К списку15
Оператор
DEFRAG
Удаляет файлы после DELF совсем, выполняет дефрагментацию диска. Не применять для систем с нестабильным питанием. Отключения питания в процессе приведет к разрушению файловой системы. Должно быть не более 63 файлов

RENAME
13 LINK \l "Список" 14К списку15
Оператор
RENAME *$(i),“BAC.TXT”
Изменяет имя файла указанного в первом параметре на имя указанное во втором параметре.

FCOPY
13 LINK \l "Список" 14К списку15
Оператор
FCOPY “REM.TXT”, *$(i)
Копирует файл в пределах диска. Первый параметр имя файла источника, второй – имя файла, который будет создан. Если такой файл существует то сначала он будет удален, а потом будет создан новый. Если удаленный файл не последний, требуется провести дефрагментацию.

EOF{}
13 LINK \l "Список" 14К списку15

Функция
(End Of File)
A=EOF{}
Возвращает 1, если достигнут конец файла или нет открытых файлов, и 0, если еще есть данные в файле.

LOF{}
13 LINK \l "Список" 14К списку15
Функция
(Len Of File)
A=LOF{}
Возвращает длину открытого файла


LOC{}
13 LINK \l "Список" 14К списку15
Текущая позиция в файле
A=LOC{}
Возвращает текущую позицию чтения или записи в файле.

SEEK
13 LINK \l "Список" 14К списку15
Оператор
SEEK 200
SEEK A
Устанавливает текущую позицию чтения или записи в файле. Устанавливает на последний байт, если указатель превышает длину файла.

FPRINT
13 LINK \l "Список" 14К списку15
Оператор вывода.
FPRINT “DATE=”,X
FPRINT Y,”,”;
Печать в ранее открытый файл. Если файл не существует, то будет создан. Если файл существует то будет применяться кольцевая запись – в случае записи за предел длинны файла запись произведется с начала файла. Аналогично оператору PRINT, только данные выводятся в файл. Так будет *.csv файл. Указатель сдвигается на число записанных байт.





FSAVE
13 LINK \l "Список" 14К списку15




Оператор вывода переменных в файл





FSAVE *$(i)

FSAVE #(i), #2(i),V

FSAVE @(i),@3(i)



Вывод данных в ранее открытый файл. Если файл открыт для кольцевой записи то в случае записи за предел длинны файла запись произведется с начала файла..
Вывод строки в файл. Первый записываемый в файл байт будет содержать число записанных байт $(i).
Копируется от одного до трех байт в зависимости от типа переменной.
Старший байт пишется первым.
Копируется от 2 до 6 байт в HEX записи на каждую переменную в зависимости от ее размерности. Старший байт пишется первым.
Во всех случаях поддерживаются списки переменных вывода, включая разные типы. Элементы списка разделены запятыми. Указатель сдвигается на число записанных байт.








FREAD{}
13 LINK \l "Список" 14К списку15







Чтение из файла в переменные







A=FREAD{*$(i)}
A=FREAD{#(i), #2(i),V}

A=FREAD{@(i),@3(i)}

A=FREAD{~A,~b,~#2(i),~V}


Функция возвращает единицу в случае удачного завершения чтения данных из ранее открытого файла и ноль в случае не удачи. Например входящие данные нельзя интерпретировать как строку ввода или не совпадает тип или размерность входных данных. Также неудачей закончится попытка чтения данных, если файл пустой или уже закончился. После чтения указатель сдвигается на число прочитанных данных. Поддерживаются списки разных типов, кроме *.csv
Чтение строки из файла в переменную в фигурных скобках
Читает от одного до трех байт на каждую переменную и помещает в указанные переменные. Число байт определяется размерностью переменных. Старший байт читается первым.
Читает от 2 до 6 байт текста в HEX записи на каждую переменную и помещает в указанные переменные. Число байт определяется размерностью переменных. Старший байт читается первым.
Из файла считывается число текстом до разделителя (запятая = *.csv) и как число записывается в указанную переменную. Указатель сдвигается за разделитель. Если данные невозможно интерпретировать как число, переменная обнуляется.

WRITE
13 LINK \l "Список" 14К списку15


Оператор для загрузки данных в файл из консоли
WRITE “00112233FFAA”
Запись в открытый файл последовательности байт 0x00 0x11 0x22 0x33 0xFF 0xAA. Файл должен быть открыт как новый. Длинна одной записи ограничена длинной строки.

READ
13 LINK \l "Список" 14К списку15


Оператор чтения данных из файла в консоль
READ x


READ 10
Чтение из открытого файла с текущей позиции указанное число байт в консоль. Формат вывода текстом, дополняется концом строки 0x0D,0x0A. Если данных более нет, строка дополняется символами ND
Чтение 10 байт. 0011223344556677FFAA – есть еще данные
00112233ND – прочли последние 4, максимально 63 байта текста подряд

FLUSH
13 LINK \l "Список" 14К списку15
Сброс дискового кеша
FLUSH

Сброс дискового кеша на диск без закрытия файла. Если файл открыт на запись как новый и в него редко пишутся данные, то информация на диске обновится по закрытию файла. Неожиданный сброс по питанию приведет к потере данных в файле. В этом случае требуется после записи сбрасывать дисковый кеш. И тогда при сбое по питанию все записанные данные будут на диске.


Операторы и функции работы с шиной I2c 13 LINK \l "Список_разделов" 14список разделов15
Обмен выполняется на внешней шине I2c на скорости 400кГц.
IISTR
13 LINK \l "Список" 14К списку15
Старт обмена данными
I2STR
Старт обмена данными на шине I2c

IISTP
13 LINK \l "Список" 14К списку15
Стоп обмена данными
I2STP
Cтоп обмена данными на шине I2c

IIADW{}
IIADW
13 LINK \l "Список" 14К списку15
Запись 7 битного адреса на запись
Q=I2ADW{a}

I2ADW a
Возвращает 1 в случае ответа I2c устройства (bit ASK =0) или 0 если ответа нет
Просто запись адреса со сброшенным битом R/W
Bit r/w = 0

IIADR{}
IIADR
13 LINK \l "Список" 14К списку15
Запись 7 битного адреса на чтение
Q=I2ADR{a}

I2ADR a
Возвращает 1 в случае ответа I2c устройства (bit ASK =0) или 0 если ответа нет
Просто запись адреса с установленным битом R/W
Bit r/w = 1

IIWR
13 LINK \l "Список" 14К списку15
Запись 8bit данных I2c
I2WR X
Запись следующего байта в шину I2c
Пример: запись 2х байт v,w по адресу a
IISTR:IIADRW a:IIWR v:IIWR w:IISTP

IIRD{}
13 LINK \l "Список" 14К списку15
Чтение 8bit данных I2c
X=I2RD{}
Чтение следующего байта с шины I2c (ASK bit=0)

IIRE{}
13 LINK \l "Список" 14К списку15
Завершающее чтение 8bit данных I2c
X=I2RE{}
Чтение последнего байта с шины I2c (NO ASK bit= 1)
Пример: чтение 2х байт v,w по адресу a
IISTR:IIADRR a:v=IIRD{}:w=IIRE{}:IISTP



Операторы и функции работы с датчиками MH-Z19, MH-Z16, COZIR, SHT10 13 LINK \l "Список_разделов" 14список разделов15
Используется третий порт UART или шина I2c
MHZ{}
13 LINK \l "Список" 14К списку15
Получить концентрацию CO2 в PPM
C=MHZ{}
Возвращает значение в PPM в диапазоне 1-5000 / 1-2000 в зависимости от модели или ноль в случае ошибки или не доступности датчика .Используется третий порт UART

SHTH{}
13 LINK \l "Список" 14К списку15
Получение влажности с датчика SHT
H=SHTH{}
Возвращает значение относительной влажности в процентах в диапазоне 0,0-100,0% с точностью 0,1% при температуре 25 град С. Так для 25,8% возвращаемое значение = 258. В случае отсутствия или ошибки возвращается значение -32768. Выполняется примерно 50 - 400mS.

SHTT{}
13 LINK \l "Список" 14К списку15
Получение температуры с датчика SHT
T=SHTT{}
Возвращает значение температуры в градусах Цельсия в диапазоне -40,0-123,8 градуса с точностью 0,1градус . Так для 25,8 градуса возвращаемое значение = 258. В случае отсутствия или ошибки возвращается значение -32768. Выполняется примерно 50 - 400mS.

CZINI
13 LINK \l "Список" 14К списку15
Оператор
инициализации датчика Cozir

CZINI
Инициализация датчика COZIR.
Устанавливается режим опроса, и усреднение данных 1/16.
Устанавливается автокалибровка 1/8 дней
Очищается буфер приема. Выполняется примерно 400mS.

CZCMD
13 LINK \l "Список" 14К списку15
Оператор команд датчика Cozir

CZCMD “A 32”
CZCMD “@ 1.0 8.0”

CZCMD “@ 0”
CZCMD “K 2”

CZCMD “X 400”

Подает команду датчику COZIR. Сама команда пишется в кавычках
Примеры команд: (параметр(ы) перечисляются через пробел: «А_32»)
«A 32» А – установка цифрового фильтра 1/32, допустимо 1,2,4,8 64
«@ 1.0 8.0» - автокалибровка 1/8 дней
«@ 0» - автокалибровка выключена
«K 2» - установка режима опроса, совместимого с функцией CZRD (выполняется в команде CZINI)
«X 400» - калибровка CO2 400 ppm
Формат остальных команд смотрите в описании на COZIR

CZRD{}
13 LINK \l "Список" 14К списку15
Функция получения данных с датчика Cozir

A=CZRD{i}

A=CZRD{#(0)}
A=CZRD{1}
A=CZRD{2}
A=CZRD{3}
Получает данные с датчика Cozir. Датчик должен быть предварительно настроен (CZINI). Ожидание ответа до 100 mS.
Если i равно 1 то переменной A присваивается значение влажности
в процентах , с точностью 0,1%
Если i равно 2 то переменной A присваивается значение температуры
в градусах цельсия, с точностью 0,1 градус
Если i равно 3 то переменной A присваивается значение CO2 в PPM

В случае недоступности датчика, переменной A присваивается значение -32768



Сетевые операторы и функции протокол MODBUS RTU. 13 LINK \l "Список_разделов" 14список разделов15

MDR{}
13 LINK \l "Список" 14К списку15

Использует 2 порт.
Контроллер является мастером

Функция чтения
1 (0x01) чтение значений из нескольких регистров флагов (Read Coil Status).
2 (0x02) чтение значений из нескольких дискретных входов (Read Discrete Inputs).
3 (0x03) чтение значений из нескольких регистров хранения (Read Holding Registers).
4 (0x04) чтение значений из нескольких регистров ввода (Read Input Registers).
x=MDR{a,F,A,Q,#2(10)}
Возвращает значение в x - единица в случае удачного завершения и ноль в случае не удачи: время ожидания ответа превысило 0.5 сек, несовпадение контрольных сумм, получен код ошибки или другие ошибки.
Пакет запроса чтения формируется из: адреса устройства a один байт; номера функции F один байт; адреса первого элемента A два байта; количества регистров для чтения Q – два байта и контрольной суммы, которая добавляется автоматически. 16 бит адрес и данные передаются старшим байтом вперед. Контрольная сумма младшим вперед.
После отправки запроса функция ждет ответ от устройства с адресом a в течении до 500mS и в случае получения ответа принятые данные помещает в 16-битные индексные переменные, начиная с #2(10).
Первый запрашиваемый регистр ответе, 16 битное число старшим байтом вперед, будет записано в #2(10), второй в #2(12), и так далее в зависимости от количества запрашиваемых элементов. Следует следить за размерностью ответа и резервировать необходимое количество памяти. В качестве приемника возможны только индексные 8/16 бит переменные. В случае 8 битных – старший принятый байт каждой отбрасывается.
Функция проверяет совпадение количества элементов при запросе и ответе. Функция проверяет контрольную сумму пришедшего пакета.
Поддерживается чтение до 16 регистров в одном запросе.

MDW{}
13 LINK \l "Список" 14К списку15

Использует 2 порт.
Контроллер является мастером

Функция записи

Запись одного значения
5 (0x05) запись значения одного флага (Force Single Coil).
6 (0x06) запись значения в один регистр хранения (Preset Single Register).

Запись нескольких значений
15 (0x0F) запись значений в несколько регистров флагов (Force Multiple Coils)
16 (0x10) запись значений в несколько регистров хранения (Preset Multiple Registers)



[ Cкачайте файл, чтобы посмотреть ссылку ]





x=MDW{a,F,A,D}



x=MDW{a,F,A,Q,#2(10)}
Возвращает значение в x - единица в случае удачного завершения и ноль в случае не удачи: время ожидания ответа превысило 0.5 сек, несовпадение контрольных сумм, получен код ошибки или другие ошибки.
Пакет запроса чтения формируется из: адреса устройства a один байт; номера функции F один байт; адреса первого элемента A два байта; данных для записи D – два байта и контрольной суммы, которая добавляется автоматически. 16 бит адрес и данные передаются старшим байтом вперед. Контрольная сумма младшим вперед.
Пакет запроса чтения формируется из: адреса устройства a один байт; номера функции F один байт; адреса первого элемента A два байта;
количества регистров для записи Q – два байта; количества 16 бит регистров *2 = 1 байт всегда четный; данных для записи по два байта на каждый регистр, которые берутся из индексной 16 бит переменной
#2(10) первое значение , #2(12), второе значение и так далее в зависимости от количества передаваемых элементов Q и контрольной суммы, которая добавляется автоматически. 16 бит адрес и данные передаются старшим байтом вперед. Контрольная сумма младшим вперед.
После отправки запроса функция ждет ответ от устройства с адресом a в течении до 500mS и возвращает значение в x
В качестве источника данных возможны только индексные 16 бит переменные.
Функция проверяет контрольную сумму пришедшего пакета.
Поддерживается чтение до 16 регистров в одном запросе.
Любые другие нестандартные функции можно сформировать с помощью текстовых переменных и операторов/функций
Создать текстовую переменную с телом запроса *$(x)
Посчитать контрольную сумму и дописать к ней CRCm
Отправить пакет как массив с того же индекса SPUT #(x)
Выдержать время и считать ответ в текстовою переменную SGET{}
Проверить контрольную сумму CRCm{}
Прочесть нужные байты информации из массива с адреса текстовой переменной, если требуется

MDI{}
13 LINK \l "Список" 14К списку15

Использует 2 порт.
Контроллер является мастером

Функция запроса информации

17 (0x11) Чтение информации об устройстве (Report Slave ID)
*$(10)=MDI{a}
Возвращает в текстовую переменную принятую строку информации об устройстве или пустую строку #(10)=0 в случае отсутствия ответа.
Пакет запроса чтения формируется из: адреса устройства a один байт; номера функции 0x11 один байт и контрольной суммы, которая добавляется автоматически. 16 бит адрес и данные передаются старшим байтом вперед. Контрольная сумма младшим вперед.
Ожидается прием ответа состоящего из: номера функции – 1 байт. Числа байт текста – 1 байт в диапазоне 1-63, и собственно текста указанной длинны. Завершает пакет контрольная сумма.

Операторы и функции работы с модулями расширения на шине MODBUS


MDSR{}
13 LINK \l "Список" 14К списку15



Функция чтения данных устройства MODBUS ( функция 0x41) Для модулей расширения датчиков и выходов

A=MDBSR{a,N}
Отправляет пакет в устройство с адресом = a, на чтение одного параметра с адресом параметра = N. Ожидает ответ не более 50 мс. Переменной А присваивает значение из ответа. Если ответа не было, переменной присваивается значение -32768. Устройство также может отдать значение -32768 если данный параметр не используется в нем.

MDSW{}
13 LINK \l "Список" 14К списку15
функция 0x42

Запись данных в модули расширения датчиков и выходов MODBUS

A=MDBSW{a,N,D}
Отправляет пакет в устройство с адресом = a, на запись одного параметра с адресом параметра = N, значением D. Ожидает ответ не более 50 мс. Переменной А присваивает значение единица при удачной отправке и ноль если ответа не было или запись не удачна


MDС
13 LINK \l "Список" 14К списку15
MDB
13 LINK \l "Список" 14К списку15



Оператор запроса консоли для DEVICE PICµBASIC
Служебный

Использует 1 и 2 порт.

MDC а,data
MDB а,data
Отправляет текстовые данные data от запятой до конца строки, указанные без кавычек, в устройство с адресом а, заданным переменной или числом, с номером функции 0x43 (MDC) или 0x42(MDB). Добавляет заголовок, символы конца строки и контрольную сумму.
Ожидание ответа происходит в фоновом режиме для последнего преданного адреса и функции. В случае успешного приема проверяет контрольную сумму и передает содержимое в консоль.
В консоль контрольная сумма и заголовок пакета не передается. Для отключения прослушивания – вызвать с нулевым адресом и пустой строкой. Назначение - транзит консоли и бутлоадера через мастер контроллер на слейв.

MBIRQ
13 LINK \l "Список" 14К списку15
Включение и настройка прерывания от MODBUS SLAVE
MBIRQ YYYY


Если номер строки перехода по прерыванию YYYY = 0 то прерывание отключается. Если не равен и более нуля – включается. Всего один вектора прерывания. Источником прерывания является запись параметра в контроллер по протоколу MODBUS. При выполнении условий прерывание дожидается выполнения текущей строки программы и вызывает подпрограмму с адреса YYYY, которая должна заканчиваться оператором RETURN. В момент вызова само прерывание отключается. Для повторного применения в конце подпрограммы, перед оператором RETURN, в одной строке, требуется повторное включение.


MODBUS slave интерфейс контроллера (SLAVE MODE). 13 LINK \l "Список_разделов" 14список разделов15

Использует первый порт. Контроллер является слейв устройством. Интерфейс включен, когда работает программа на BASIC.
Работа в этом режиме контролируется системой и не требует действий пользователя. Чтение/запись происходят в фоновом режиме для пользователя. Время ответа не более 100 mS. Интерфейс позволяет внешним устройствам получить доступ к 512 8-битным переменным BASIC с адресами 0-511 и к 256 16 битным переменным BASIC с адресами 0-510 с правами на чтении и запись.
Программа пользователя должна сама позаботиться о правильной интерпретации данных их этих регистров, как входных данных если другой контроллер производит запись или сама выкладывать в них данные для чтения другим контроллером. Также требуется согласование для обоих программ обоих контроллеров адресов регистров для обмена информацией. Выделенная для обмена память не затрагивает обычные переменные и стеки переменных и текста.
Поддерживает функции
3 (0x03) чтение значений из нескольких регистров хранения (Read Holding Registers).
16 (0x10) запись значений в несколько регистров хранения (Preset Multiple Registers)
17 (0x11) Чтение информации об устройстве (Report Slave ID)
Список адресов регистров BASIC_MODBUS_RTU_REGISTER
Диапазоны адресов в сети MODBUS
Диапазон адресов 0-2047
Чтение или запись в адресном пространстве в диапазоне 0-2047
(реализовано 0-511) читает или записывает значения в 8 битных переменных #(0) - #(511) при этом запрос по адресу 0 соответствует #(0), по адресу 1 соответствует #(1), и тд.
Диапазон адресов 2048-4095
Чтение или запись в адресном пространстве в диапазоне 2048-4095 (реализовано 2048-2303) читает или записывает значения в 16 битных переменных #2(0)- #2(510) с шагом индекса 2
При этом запрос по адресу 2048 соответствует #2(0), по адресу 2049 соответствует #2(2), и тд.


Сетевые операторы и функции Ethernet 13 LINK \l "Список_разделов" 14список разделов15

PING{}
13 LINK \l "Список" 14К списку15
Функция PING заданного узла
A=PING{192.168.1.1}
A=PING{K.L.M.N}
Переменной A присваивается время в миллисекундах ожидания ответа на ping заданного узла. В случае недоступности A=-32768. Может выполняться до 3 секунд.

IPNEW{}
13 LINK \l "Список" 14К списку15
Функция получения нового IP адреса по DHCP
A=IPNEW{}
Попытка получить новый IP адрес по DHCP. IP адрес изменится в случае удачного запроса. Контроллер обычно загружается быстрее DHCP сервера по сбросу питания, и требуется обновление IP через какое то время после старта (для конфигураций с включенным DHCP). Если DHCP отключен - обновление не произойдет.
Возвращает 1 в случае обновления по DHCP, 0 если DHCP не доступен

IPCFG
13 LINK \l "Список" 14К списку15
Оператор получения текущих сетевых настроек в строку
IPCFG #(0)
В переменную #(0) помещается структура текущих сетевых настроек.
В первые девять байт #(0) - #(8) имя контроллера, как текст (может быть выведен как $(0))
#(9)- #(12) текущий IP, 4 байта
#(13) – DG последний октет
#(14) – MASK последний октет
#(15) - reserved (00)

UDPSND{}
13 LINK \l "Список" 14К списку15

Функция отправки UDP пакета
A=UDPSND{$(0),192.168.1.1:253}
A=UDPSND{#(0),K.L.M.N:P}
Посылает UDP пакет на указанный IP : PORT с текстом из переменной $(0), до 63 байт
Посылает UDP пакет на указанный IP : PORT длинной 64 байта из #(0)-#(63)
Возвращает 1 в случае успеха, 0 если маршрут не доступен
Может выполняться до 2 секунд. В случае выполнения из консоли не выполнения - будет расшифровка ошибок

TCPSND{}
13 LINK \l "Список" 14К списку15

Функция отправки HTTP запроса на сторонний сервер методом GET

A=TCPSND{$(0),192.168.1.1:80}






A=TCPSND{$(0),K.L.M.N:P, $(520)}
Посылает запрос на указанный IP : PORT с текстом из переменной $(0), до 63 байт вида :
GET /index.htm?lg=web&ps=as&hs=123456 HTTP/1.1
0x0D 0x0A User-Agent: NAME_CONTROLLER’ 0x0D 0x0A 0x0D 0x0A
Где $(0) = /index.htm?lg=web&ps=as&hs=123456
Как минимум $(0) должна содержать символ «/», если она пустая, то «/» будет подставлен автоматически.

Посылает запрос на указанный IP : PORT с данными из переменной #(0)-#(63) – 64 байта.
Возвращает 1 в случае успеха, 0 если не отправлено
Может выполняться до 3 секунд.
В случае выполнения из консоли не выполнения - будет расшифровка ошибок

В переменную $(520), если она указанна, помещает данные, как текст, из буфера последнего принятого пакета.
Данные будут обрезаны до размера 63 байт.

TCPPST{}
13 LINK \l "Список" 14К списку15

Функция отправки HTTP запроса на сторонний сервер методом POST

A=TCPPST{$(0),$(150),192.168.1.1:80}












A=TCPPST{$(0),$(150),K.L.M.N:P, $(520)}
Посылает запрос на указанный IP : PORT=192.168.1.1:80 с текстом из переменной $(0) и переменной $(150), до 63 байт вида :
POST /index.htm HTTP/1.10x0D 0x0A
User-Agent: NAME_CONTROLLER’ 0x0D 0x0A
Content-Type: application/x-www-form-urlencoded 0x0D 0x0A
Content-Length: 35 0x0D 0x0A 0x0D 0x0A
login=Petya%20Vasechkin&password=qq

Где $(0) = /index.htm
Как минимум $(0) должна содержать символ «/», если она пустая, то «/» будет подставлен автоматически.
и $(100) = login=Petya%20Vasechkin&password=qq
и 35 – это длинна переменной $(100)

Посылает запрос на указанный IP : PORT с текстом из переменной $(0),$(150)-#(63) – 64 байта.
Возвращает 1 в случае успеха, 0 если не отправлено
Может выполняться до 3 секунд.
В случае выполнения из консоли не выполнения - будет расшифровка ошибок

В переменную $(520), если она указанна, помещает данные, как текст, из буфера последнего принятого пакета.
Данные будут обрезаны до размера 63 байт.

Для правильной работы в общей сети должен быть указан адрес шлюза по умолчанию и маска сети.






ПРИЛОЖЕНИЯ

Периферийные модули
Дисплей с контроллером HD44780 13 LINK \l "Список_разделов" 14список разделов15
Знакогенератор дисплея с русской прошивкой
Символы с кодами 00-0F – программируемые
Программирование пользовательских символов
Символьный дисплей выполнен на контроллере HD44780 позволяет загружать до 8 пользовательских символов любого начертания
Для программирования своего символа требуется загрузить адрес символа, его графическое представление – 8 байт. В котором последние пять бит будут отображать пиксели в 8 строках на символ. Установленный бит - затемненный пиксель. После программирования всех необходимых символов требуется заново инициализировать дисплей. Сам вывод можно производить командой LCDD х , где х – код символа от 0 до 7. Или LPRINT $(х), где переменная $(х) содержит код символа от 1 до 7.
Результат выполнения



Собственно пример программы
REM '****************************************************
REM ' Подпрограмма программирования нового символа
REM ' для дисплея HD44780
REM ' VER 4.0
REM '****************************************************
REM ' ***************************************************
REM ' Требуется ОБРАБОТКА ПРЕКОМПИЛЯТОРОМ BASIC
REM '****************************************************
0000
CLR:LINIT 1
REM ' Любой символ имеет адрес расположения равный 0х00 - 0х07
REM ' мы можем записать до 8 необходимых нам символов
REM ' Символ состоит из матрицы 5*8 точек, как праавило
REM ' нижняя строка не занята, для курсора

REM ' пример термометра
REM '
REM ' * * # * * 0b0000100 = 4
REM ' * # * # * 0b0001010 = 10
REM ' * # * # * 0b0001010 = 10
REM ' * # # # * 0b0001110 = 14
REM ' * # # # * 0b0001110 = 14
REM ' # # # # # 0b0011111 = 31
REM ' # # # # # 0b0011111 = 31
REM ' * # # # * 0b0001110 = 14
REM '
REM ' пример Капельки

REM '
REM ' * * # * * 0b0000100 = 4
REM ' * * # * * 0b0000100 = 4
REM ' * # * # * 0b0001010 = 10
REM ' * # * # * 0b0001010 = 10
REM ' # * * * # 0b0010001 = 17
REM ' # * * * # 0b0010001 = 17
REM ' # * * * # 0b0010001 = 17
REM ' * # # # * 0b0001110 = 14
REM '
REM ' Еденичками кодируются закрашенный точки
REM ' Для записи требуется
REM ' Выбрать адрес символа
REM ' Записать собственно битовую таблицу

[New_symbol]
REM ' это будет символ с кодом ноль
REM ' для записи код надо умножить на 8 и + 64,
REM 'Запишем его, формируем команду
LCDC 64:REM ' код =0; = 0*8+64

REM ' Определим таблицу для символа
DATA #(10),4,10,10,14,14,31,31,14
REM ' Грузим символ - можно вынести в подпрограмму
FOR i=10 TO 17
LCDD #(i)
NEXT i

LCDC 72:REM ' код =1; = 1*8+64
REM ' Определим таблицу для второго символа
DATA #(10),4,4,10,10,17,17,17,14
REM ' Грузим символ
FOR i=10 TO 17
LCDD #(i)
NEXT i


REM 'Заново настроим дисплей, и все будет готово
LINIT 1
REM 'Печать символов
AT 0
LCDD 0:LCDD 1
REM 'Для кодов , отличных от нуля можно использовать LPRINT
AT 5
#(1)=1
LPRINT $(1)
END



Программа после компилятора
0000 CLR:LINIT 1
0001 LCDC 64:REM ' код =0; = 0*8+64
0002 DATA #(10),4,10,10,14,14,31,31,14
0003 FOR i=10 TO 17
0004 LCDD #(i)
0005 NEXT i
0006 LCDC 72:REM ' код =1; = 1*8+64
0007 DATA #(10),4,4,10,10,17,17,17,14
0008 FOR i=10 TO 17
0009 LCDD #(i)
0010 NEXT i
0011 LINIT 1
0012 AT 0
0013 LCDD 0:LCDD 1
0014 AT 5
0015 #(1)=1
0016 LPRINT $(1)
0017 END


Дисплей с контроллером UC1601s 13 LINK \l "Список_разделов" 14список разделов15

На этом контроллере выпускается широкий спектр графических дисплеев
RDT06569-IE - 128x32 точки, видимая область 65.5х30.16
RDX0032-GC - 128x32 точки, видимая область 76.0х23.0
RDX0048-GC - 128x32 точки, видимая область 26.0х8.0
RDX0077-GS - 128x64 точки, видимая область 67.5х34.6
RDX0120-GC - 64x32 точки, видимая область 39.86х23.0
RDX0154-GC - 132x64 точки, видимая область 62.0х32.0

В данном контроллере дисплей может использоваться в текстовом и графическом виде.
Для текстового вывода используется знакогенератор 6*8 с латинскими и русскими буквами с кодами символов от 0x20 до 0xFF



Также имеются символы псевдографики и различные пиктограммы.

Ориентация дисплея

Программно можно управлять ориентацией дисплея. Доступно четыре режима поворота координатных осей.
В случае дисплеев с разрешением менее 64*132 будет отображаться только часть картинки.


Существует два положения курсора - символьный 132*8 и графический 132*64.
Символьный курсор - количество точек с начала строки и номер строки, графический – количество точек от начала координат.

Дискретные входы и выходы

Для использования входов контроллера с датчиками типа «сухой контакт» требуется применение резисторов подтяжки к логической единице (+3,3V). Номинал резистора выбирается исходя из длинны линии и тока через контакт. Также следует принять меры для защиты входа контроллера от импульсных наводок или статического электричества при длинном шлейфе от контакта до контроллера.
Для ответственных приложений следует применять только контакты на размыкание, а в случае использования герконов в качестве датчиков – дублировать контакты. Устанавливать попарно последовательно при работе на размыкание.
В случае невозможности общей земли или при работе с устройствами имеющими связь с сетью переменного тока требуется применять опторазвязки входов и/или выходов или применять реле.


MODBUS RTU MASTER

Данный контроллер поддерживает интерфейс связи с подчиненными контроллерами DEVICE. В качестве протокола выбран распространенный стандарт MODBUS RTU.
Для управления и контроля подчиненными контроллерами использованы стандартные функции протокола. Применительно к встроенному языку операторы поддерживают обмен значениями переменных BASIC между контроллерами по инициативе мастер устройства. Для подчиненного устройства обмен происходит в фоновом режиме, не зависимо от исполняемой там программы.
Дополнительно реализован служебный обмен данными для прозрачной работы удаленного терминала и загрузки обновленных прошивок через сеть Ethernet

Общий алгоритм обмена выглядит следующим образом.
- Мастер (WEB PICµBASIC) выполняет программу и с помощью соответствующих операторов запрашивает переменную или передает переменную в подчиненный контроллер с выбранным адресом.
- Слейв DEVICE PICµBASIC в фоновом режиме, не прекращая выполнения своей программы, обрабатывает запрос и выполняет указанные действия. Модифицирует свою переменную в соответствии с принятым значением или передает значение своей переменной.
После выполнения операции Слейв отсылает подтверждающий пакет о выполненных действиях или пакет с данными.
- Мастер принимает ответ и возвращает из функции статус операции – успешно или ошибка, также принимает данные в указанную переменную, если пришли данные. Время выполнения данных функций вариабельно и зависит от времени ответа слейв устройства. Максимальное время ожидания ответа до ошибки тайм аута - 500 mS.
Дополнительную информацию о временных параметрах обмена смотрите в приложении.

Доступ в режиме терминала.
Если программа остановлена, и контроллеры находятся в терминальном режиме, то появляется доступ к терминалу слейв устройства. Для этого необходимо в программе терминала, после соединения с PICµBASIC перевести в режим MODBUS с указанием адреса подчиненного устройства. После этого все команды от и к терминалу будут транслироваться на подчиненное устройство. Аналогично работает загрузка и выгрузка программ на Basic. Для удаленного обновления ПО Basic следует использовать Ethernet загрузчик .
В дальнейшем Слейв устройство может работать, как с обменом данными с мастером, или как самостоятельное устройство.
Доступ к BASIC DEVICE из сторонних программ
BASIC DEVICE поддерживает функции чтения переменной 3 (0x03) и 16 (0x10)  запись значений
Чтение или запись в адресном пространстве в диапазоне 0-2047
(реализовано 0-511) читает или записывает значения в 8 битных переменных #(0)- #(511)
Чтение или запись в адресном пространстве в диапазоне 2048-4095 (реализовано 2048-2303) читает или записывает значения в 16 битных переменных #2(0)- #2(510) с шагом индекса 2


Адреса MODBUS RTU

Диапазон адресов – 1-127

Клавиатура и силовые выходы

Для организации интерактивного управления к контроллеру подключаются дисплей и кнопки. Рассмотрим подключение кнопок к контроллеру
Как правило достаточно всего пяти кнопок: влево, вправо, вверх , вниз, Ок. Кнопками влево- вправо выбирается параметр ,который требуется изменить. Кнопкам и вверх и вниз производится изменение значения, а кнопкой Ок подтверждается принятие изменений.
Опрос кнопок происходит оператором GKEY, ожидание нажатия - WKEY.

Номера входов I/O следует выбирать в диапазоне одного канала проса оператора – 1-15 , 16-30, 31-34
Например I/O17-I/O21
Тогда используем
A=GKEY{x,2,62} (анализ с бита 1 по бит 5)
Где х – тип опроса
Если х=0 то в переменную А запишется состояние кнопок в момент вызова функции.
Если х=1 то А присваивается битовое значение номера входа, на котором было изменение состояния от момента предыдущего вызова GKEY или WKEY. Текущее состояние берется базой состояния для следующего вызова

A = 2*inp1 + 4*inp2 + 8*inp3 + 16*inp4 + 32*inp5

Функция WKEY производит ожидание нажатия кнопки, попадающей в маску.

Пример программы опроса кнопок на I/O 17- 21

0010 PAUSE 50
0014 REM WAIT ALL KEY UNPRESS
0015 A=GKEY{0,2,62}:IF A<>62 THEN GOTO 10
0018 REM WAIT PRESS ANY KEY
0020 A=WKEY{0,2,62}
0048 REM SELECT AND PRINT NUMBER KEY
0050 CASE A,2,200,4,250,8,300,16,350,32,400
0200 PRINT "PRESS #1":GOTO 10
0250 PRINT "PRESS #2":GOTO 10
0300 PRINT "PRESS #3":GOTO 10
0350 PRINT "PRESS #4":GOTO 10
0400 PRINT "PRESS #5":GOTO 10

Управление мощной нагрузкой осуществляется через силовые ключи или реле. Если нагрузка не связана со схемой электрически, то всегда следует применять реле или опторазвязку.

Примеры схем подключения изолированных входов /выходов

Управление из программы - используем оператор PORT
Пример для подключения реле к I/O 4- 7 с управлением от кнопок с предыдущего примера
0010 PAUSE 50
0014 REM WAIT ALL KEY UNPRESS
0015 A=GKEY{0,2,62}:IF A<>62 THEN GOTO 10
0018 REM WAIT PRESS ANY KEY
0020 A=WKEY{0,2,62}
0048 REM SELECT AND PRINT NUMBER KEY
0050 CASE A,2,200,4,250,8,300,16,350,32,400
0200 PRINT "RELAY #1 ON/OFF":PORT 4,2:GOTO 10
0250 PRINT "RELAY #2 ON/OFF":PORT 5,2:GOTO 10
0300 PRINT "RELAY #3 ON/OFF":PORT 6,2:GOTO 10
0350 PRINT "RELAY #4 ON/OFF":PORT 7,2:GOTO 10
0400 PRINT "ALL RELAY OFF":PORT 4,0:PORT 5,0:PORT 6,0
0410 PORT 7,0:GOTO 10

ПРИЛОЖЕНИЯ
Формат пакетов MODBUS MODBUS RTU PICµBASIC
Описание
Расшифровка

В качестве регистров хранения (Read Holding Registers) в контроллерах выступают переменные.
3 (0x03)  чтение значений из одного или нескольких регистров хранения (Read Holding Registers).
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым. В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
Любая переменная передастся двумя байтами, в случае индексной 8бит переменной, старший = 0.
Запрос

1 байт – Адрес устройства
2 байт – Функция 0x03
3 байт - Адрес первой ячейки(параметра) (HIGH)
4 байт - Адрес первой ячейки(параметра) (LOW)
5 байт - Число ячеек(HIGH)
6 байт - Число ячеек(LOW)
7 байт - CRC (LOW)
8 байт - CRC (HIGH)

Ответ

1 байт – Адрес устройства
2 байт – Функция 0x03
3 байт - Счетчик байт данных
4 байт - Данные(addr) singed (HIGH)
5 байт - Данные(addr) singed (LOW)
--/ *+1 байт --/ Данные(addr+1) singed (HIGH)
--/ *+2 байт --/ Данные(addr+1) singed (LOW)
...
7/n-1 байт - CRC (LOW)
8/n байт - CRC (HIGH)


16 (0x10)  запись значений в несколько регистров хранения (Preset Multiple Registers)
Запрос

1 байт – Адрес устройства
2 байт – Функция 0x10
3 байт - Адрес первой ячейки(параметра) (HIGH)
4 байт - Адрес первой ячейки(параметра) (LOW)
5 байт - Число ячеек (параметра) (HIGH)
6 байт - Число ячеек (параметра) (LOW)
7 байт - Счетчик байт данных
8 байт - Данные(addr) singed (HIGH)
9 байт - Данные(addr) singed (LOW)
--/ *+1 байт --/ Данные(addr+1) singed (HIGH)
--/ *+2 байт --/ Данные(addr+1) singed (LOW)
...
7/n-1 байт - CRC (LOW)
8/n байт - CRC (HIGH)
Ответ

1 байт – Адрес устройства
2 байт – Функция 0x10
3 байт - Адрес первой ячейки(параметра) (HIGH)
4 байт - Адрес первой ячейки(параметра) (LOW)
5 байт - Число ячеек (параметра) (HIGH)
6 байт - Число ячеек (параметра) (LOW)
7 байт - CRC (LOW)
8 байт - CRC (HIGH)


17 (0x11) Чтение информации об устройстве (Report Slave ID)
Пример
-> ADR, 0x11, CRC_L, CRC_H
<- ARD, 0x11, кол-во байт, text- xx BYTES , CRC_L, CRC_H

Запрос

1 байт – Адрес устройства
2 байт – Функция 0x11
3 байт - CRC (LOW)
4 байт - CRC (HIGH)

Ответ

1 байт – Адрес устройства
2 байт – Функция 0x11
3 байт - Счетчик байт данных
4 байт и далее – Данные TEXT max 63b
...
/n-1 байт - CRC (LOW)
/n байт - CRC (HIGH)

Пользовательские функции

66 (0x42) Данные BOOTLOADER

-> ARD, 0x42, text- xx BYTES , CRC_L, CRC_H
<- ARD, 0x42, text- xx BYTES , CRC_L, CRC_H

Запрос

1 байт – Адрес устройства
2 байт – Функция 0x42
3 байт и далее – Данные TEXT max 64b
/n-1 байт - CRC (LOW)
/n байт - CRC (HIGH)

Ответ

1 байт – Адрес устройства
2 байт – Функция 0x42
3 байт и далее – Данные TEXT max 64b
...
/n-1 байт - CRC (LOW)
/n байт - CRC (HIGH)

67 (0x43) Данные терминала

-> ARD, 0x43, кол-во байт xx, text- xx BYTES , CRC_L, CRC_H
<- ARD, 0x43, кол-во байт xx, text- xx BYTES , CRC_L, CRC_H

Запрос

1 байт – Адрес устройства
2 байт – Функция 0x43
3 байт - Счетчик байт данных
4 байт и далее – Данные TEXT max 64b
...
/n-1 байт - CRC (LOW)
/n байт - CRC (HIGH)
Ответ

1 байт – Адрес устройства
2 байт – Функция 0x43
3 байт - Счетчик байт данных
4 байт и далее – Данные TEXT max 64b
...
/n-1 байт - CRC (LOW)
/n байт - CRC (HIGH)

Формат пакетов MODBUS RTU модулей расширения.
Адресное пространство, выбор адреса – перемычками.

1 байт - Адрес = 0x10 - 0x1F - Блок датчиков
1 байт - Адрес = 0x20 - 0x2F - Блок силовых выходов

Запрос

1 байт – Адрес устройства
2 байт - Функция
3 байт - Адрес первой ячейки(параметра) (HIGH)
4 байт - Адрес первой ячейки(параметра) (LOW)
5 байт – Чтение - Число ячеек(HIGH) / Запись – Данные singed (HIGH)
6 байт - Чтение - Число ячеек(LOW) / Запись - Данные singed (LOW)
7 байт - CRC (LOW)
8 байт - CRC (HIGH)



Поддерживаемые функции устройствами Блок датчиков и Блок силовых выходов 2 байт - Функции


17 (0x11) Чтение информации об устройстве (Report Slave ID)
Пример
-> ADR, 0x11, CRC_L, CRC_H
<- ARD, 0x11, text- 32 BYTES , CRC_L, CRC_H

70 (0x46) Запуск загрузчика (reboot)

-> ADR, 0x46, CRC_L, CRC_H
<- ADR, 0x46, CRC_L, CRC_H


65 (0x41) Чтение данных устройства

-> ADR, 0x41, адрес ячейки -2 байта, число параметров 2 байта = 1(0x01 0x00), CRC_L, CRC_H
<- ARD, 0x41, число байт - 1байт = 0x02 , Данные 2 байта singed , CRC_L, CRC_H

66 (0x42) Запись данных в устройство

-> ADR, 0x42, адрес ячейки -2 байта, Данные 2 байта singed CRC_L, CRC_H
<- ARD, 0x42, адрес ячейки -2 байта, Данные 2 байта singed CRC_L, CRC_H
В случае успешной записи данные выходные = входным, не успешной данные выходные = -32768 (0x80,0x00)


Блок датчиков


Адреса ячеек данных и их возможные значения
В случае отсутствия/неисправности возвращает значение -32768

0 18B20 #1 температура (-55 +127)
1 18B20 #2 температура (-55 +127)
2 18B20 #3 температура (-55 +127)
3 18B20 #4 температура (-55 +127)
4 ADC 1 Значение АЦП (0-255)
5 ADC 2 Значение АЦП (0-255)
6 ADC 3 Значение АЦП (0-255)
7 ADC 4 Значение АЦП (0-255)
8 DHT22 температура (-400.. +800 = -40,0С - +80,0С)
9 DHT22 влажность (0-1000 = 0,0% - 100,0%)



Блок реле

Формат запроса - ответа
Адрес
Функция
Адрес первой ячейки (HIGH)
Адрес первой ячейки(LOW)
R- Число ячеек(HIGH)/W-data high
R- Число ячеек(LOW)/W-data low
********************
1 быйт - Адрес = 0x20 - 0x2F
2 байт - команды

17 (0x11) Чтение информации об устройстве (Report Slave ID)

-> ADR, 0x11,crc,crc
<- ARD, 0x11, text- 32 BYTES ,crc,crc

70 (0x46) Запуск загрузчика

-> ADR, 0x46,crc,crc
<- ADR, 0x46,crc,crc


65 (0x41) Чтение данных устройства

-> ADR, 0x41, addr register 2bytes, число параметров 2bytes = 1(01 00), crc,crc
<- ARD, 0x41, число байт 1 bytes = 2 (02 ), data 2 BYTES singed ,crc,crc


66 (0x42) Запись данных в устройство

-> ADR, 0x42, addr register 2bytes, data singed 2bytes (xx xx), crc,crc
<- ARD, 0x42, addr register 2bytes, data singed 2bytes (xx xx), crc,crc


Для адресов 0-3 возможна запись и чтение.
Запись «1» в регистр обозначает включение, «0» - выключение
Чтение возвращает текущее состояние

Для адресов 4-7 возможно только чтение.
Значение «1» в регистре обозначает замкнутый вход , «0» - разомкнутый
На входы подключаются концевые выключатели или «сухой контакт»

Адреса регистров

0 OUT #1 R/W
1 OUT #2 R/W
2 OUT #3 R/W
3 OUT #4 R/W
4 IN #1 R
5 IN #2 R
6 IN #3 R
7 IN #4 R



Обработка ошибок
Ведущий отправляет запрос к Ведомому, в котором в поле «код функции» указывает ему на необходимое действие.  Байты данных содержат информацию, необходимую для выполнения данной функции.  Ведомый, в случае удачного выполнения этой функции, повторяет код функции в ответе.  При возникновении ошибки, код функции в ответе модифицируется старший бит выставляется в 1. В байтах данных передается причина ошибки. Например при исполнении Ведомым функции 0x0F возникла ошибка, тогда он ответит Ведущему полем функции равным 0x8F.  В дополнении к изменению кода функции, Ведомый размещает в поле данных уникальный код, который указывает на тип и причину ошибки.
Стандартные коды ошибок
01  Принятый код функции не может быть обработан.
02  Адрес данных, указанный в запросе, недоступен.
03  Значение, содержащееся в поле данных запроса, является недопустимой величиной.
04  Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие.
05  Ведомое устройство приняло запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет ведущее устройство от генерации ошибки тайм-аута.
06  Ведомое устройство занято обработкой команды. Ведущее устройство должно повторить сообщение позже, когда ведомое освободится.
07  Ведомое устройство не может выполнить программную функцию, заданную в запросе. Этот код возвращается для неуспешного программного запроса, использующего функции с номерами 13 или 14. Ведущее устройство должно запросить диагностическую информацию или информацию об ошибках от ведомого.
08  Ведомое устройство при чтении расширенной памяти обнаружило ошибку паритета. Ведущее устройство может повторить запрос, но обычно в таких случаях требуется ремонт

CRC-16 - циклически избыточный код - полином A001h
Физический интерфейс – RS485 115200 8N1 Адресное пространство Диапазон адресов – 1-127
Временные диаграммы (для скорости 115200)
Обработка запросов с функциями 3 (0x03), 16 (0x10), 17 (0x11) всегда  выполняется в фонововом режиме, независимо от программы пользователя. Одновременно может выполняться только один запрос. Минимальное время тишины  1,5 ms. Минимальное время до начала ответа – 0mS, типичное 1mS, максимальное 200 mS (если контроллер занят функциями работы с другими критичными во времени интерфейсами). Время ожидания ответа мастером до ошибки таймаута - 500 mS.
Обработка запроса 67 (0x43) возможна в случае остановленной программы пользователя(консоль). Если запущена, то обрабатывается только одна команда - BREAK.
Обработка запроса 66 (0x42) возможна только в режиме BOOTLOADER. Минимальное время тишины 300us.
В случае ответа множеством посылок, сам контроллер формирует время тишины 2,5 mS.
Для модулей расширения
Минимальное время тишины  1,5 ms. Минимальное время до начала ответа – 0mS, типичное 1mS, максимальное 30 mS.


Расширения

Модуль COZIR™ Ambient Sensor
Данный модуль расширения поставляется по отдельному заказу.
Примечание.
1. Перед работой с датчиком порт UART должен быть настроен на скорость 9600 8N1
2. Обратите внимание, что все настройки датчика COZIR сохраняются в его энергонезависимой памяти, поэтому только датчик может быть сконфигурирован один раз. Он не должен быть настроен каждый раз, когда он включен.

Пример

LIST
0010 PAUSE 1000:UART 1,4:CZINI
0011 REM PAUSE 100:CZCMD "X 400":PAUSE 100
0015 FOR i=1 TO 50
0020 PRINT "----------------------------"
0021 A=CZRD{1}
0022 PRINT .1,"Влажность = ",A," %"
0023 A=CZRD{2}
0024 PRINT .1,"Температура = ",A," град.С"
0025 A=CZRD{3}
0026 PRINT .0,"Сод. CO2 = ",A," ppm"
0029 PAUSE 1000
0030 NEXT i

OK
RUN
----------------------------
Влажность = 53.9 %
Температура = 26.8 град.С
Сод. CO2 = 528 ppm
----------------------------
Влажность = 54.2 %
Температура = 26.8 град.С
Сод. CO2 = 521 ppm
----------------------------
Влажность = 54.2 %
Температура = 26.8 град.С
Сод. CO2 = 519 ppm
----------------------------
Влажность = 54.3 %
Температура = 26.8 град.С
Сод. CO2 = 525 ppm
----------------------------
Влажность = 54.3 %
Температура = 26.8 град.С
Сод. CO2 = 530 ppm
----------------------------
Влажность = 54.3 %
Температура = 26.8 град.С
Сод. CO2 = 528 ppm
----------------------------
Влажность = 54.2 %
Температура = 26.8 град.С
Сод. CO2 = 521 ppm
----------------------------
Влажность = 54.2 %
Температура = 26.8 град.С
Сод. CO2 = 521 ppm
OK

Продолжение следует. Схемотехника совершенствуется, набор команд и операторов увеличивается. Следите за новыми версиями.

(с) Гармаш Геннадий 2005-2018.
Замечания и предложения - [ Cкачайте файл, чтобы посмотреть ссылку ]
Поддержка и актуальные версии [ Cкачайте файл, чтобы посмотреть ссылку ]

Software Licence Agreement:
THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY
TO THIS SOFTWARE. THE AUTHOR SHALL NOT, UNDER ANY CIRCUMSTANCES, BE LIABLE
FOR SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.

ПО контроллера распространяется под лицензией Shareware.
Разрешается свободное некоммерческие использование опубликованных версий без каких либо гарантий.

*Для коммерческого использования требуется регистрация каждой копии П/О.
*Исчезнет надпись DEMO и возможно появятся дополнительные возможности.
*Вы можете заказать любые дополнения или купить проект целиком.










n А В Д И К М О ю
·
·
·
·
·
·
·4ђ Заголовок 14ђ Заголовок 24ђ Заголовок 34ђ Заголовок 44ђ Заголовок 54ђ Заголовок 64ђ Заголовок 74ђ Заголовок 84ђ Заголовок 915

Приложенные файлы

  • doc 7073064
    Размер файла: 2 MB Загрузок: 0

Добавить комментарий