Lua API для ПЛК «ГРОЗА»
Глобальные функции, доступные из скриптов Lua.
Прошивка ПЛК из PowerShell
Откройте PowerShell в папке ultragraph (где находится
flash_tool.exe) и выполните команду:
./flash_tool.exe your_script.lua
- Замените
your_script.luaна имя вашего файла. - PowerShell должен быть открыт из каталога с
flash_tool.exe. - Если видите ошибку политики, выполните:
Set-ExecutionPolicy RemoteSignedот администратора.
Кратко
Функции предоставляют доступ к таймеру, GPIO, ЦАП, кадровому буферу дисплея, пользовательской Flash и связи по UART/RS-485. Все числовые параметры и возвращаемые значения — обычные Lua-числа. Цвета — 16-бит RGB565 (0…65535).
error() (через luaL_error) — ловите это в своём коде, если нужно.
Сводка функций
| Функция | Назначение |
|---|---|
| millis(), delay(ms) | Тайм-тик в мс / задержка (busy-wait) |
| gap() | Среднее АЦП по 1024 выборкам |
| gdp(«B10») | Прочитать цифровой вход (GPIO) |
| sdp(«B10», state) | Выставить уровень на выводе (GPIO) |
| dac1(v), dac2(v) | 12-бит ЦАП (0…4095) |
| repaint(), set_bg(color) | Вывод буфера на экран и очистка / цвет фона |
| draw_pixel(x,y,c), draw_line(…), draw_rect(…,fill), draw_ellipse(…,fill), draw_triangle(…,fill), draw_text(str,x,y,font,c) | Примитивы рисования |
| flash(offset, value), getflash(offset) | Запись/чтение 16-бит слова в пользовательской Flash |
| input() | Чтение до 128 байт из общего кольцевого буфера |
| usart3_input(), uart4_input() | Чтение из RS-485/UART буферов |
| usart3_print(data), uart4_print(data) | Передача по RS-485/UART |
Таймер
millis() → integer
Возвращает текущий системный тик в миллисекундах.
delay(ms)
Задержка в миллисекундах (активное ожидание; внутри крутится цикл с prevent()).
local t0 = millis()
delay(50)
print("Прошло:", millis() - t0, "мс")
АЦП
gap() → integer
Возвращает среднее значение АЦП по 1024 последним выборкам.
local avg = gap()
print("Среднее АЦП:", avg)
GPIO
gdp("B10") → boolean
Читает уровень пина. Аргумент — строка вида "A0"…"E15". Ошибки: неверная буква порта или номер пина вне 0…15.
sdp("B10", state)
Устанавливает уровень пина. state — true/false. Контролируйте режим вывода вне Lua (инициализация).
-- моргание выводом B10:
while true do
sdp("B10", true)
delay(200)
sdp("B10", false)
delay(200)
end
ЦАП
dac1(v), dac2(v)
Выставляет 12-бит значение 0…4095. Вне диапазона — значение обрезается.
for v = 0, 4095, 128 do
dac1(v); dac2(4095 - v)
delay(10)
end
Графика / дисплей
Рисование идёт в кадровый буфер dArr. repaint() выводит буфер на экран и очищает его цветом фона.
set_bg(color)
Устанавливает цвет фона (0…65535, RGB565).
draw_pixel(x, y, color)
draw_line(x0, y0, x1, y1, color)
draw_rect(x, y, w, h, color, fill)
draw_ellipse(xc, yc, rx, ry, color, fill)
draw_triangle(x1, y1, x2, y2, x3, y3, color, fill)
draw_text(str, x, y, font, color)
Параметр font сейчас игнорируется и используется встроенный FreeMonoBold9pt8b. Для всех функций недопустимые цвета приводят к ошибке.
set_bg(0x0000) -- чёрный фон
draw_rect(10, 10, 100, 60, 0xFFFF, true) -- белый прямоугольник
draw_line(10, 10, 110, 70, 0xF800) -- красная диагональ
draw_ellipse(160, 40, 30, 20, 0x07E0, false) -- зелёный контур
draw_text("Hello, PLC!", 16, 90, "mono9", 0xFFFF)
repaint()
Пользовательская Flash
flash(offset, value)
Записывает 16-бит слово по смещению offset (диапазон: 0…USER_DATA_SIZE-2). При ошибке программирования — исключение.
getflash(offset) → integer
Читает 16-бит слово по смещению. Адрес должен быть выровнен по 2 байтам.
-- сохраним параметр
flash(0, 1234)
-- прочитаем обратно
local v = getflash(0)
print("flash[0] =", v)
Общий входной буфер
input() → string|nil
Возвращает строку до 128 байт из кольцевого буфера или nil, если данных нет.
local s = input()
if s then
print("Получено:", s)
end
UART / RS-485
usart3_input(), uart4_input() → string|nil
Читает данные из соответствующего буфера (размер по прошивке; если пусто — nil).
usart3_print(data), uart4_print(data)
Передаёт строку data по соответствующему интерфейсу.
-- простое эхо в RS-485 на USART3
local s = usart3_input()
if s then
usart3_print("echo: " .. s)
end
Мини-примеры: всё вместе
-- бежим по экрану точкой и шлём среднее АЦП раз в 200 мс
local x, y, dx, dy = 10, 20, 2, 1
set_bg(0x001F) -- синий фон
while true do
draw_pixel(x, y, 0xFFFF)
repaint()
x = x + dx; y = y + dy
if x < 0 or x > 159 then dx = -dx end
if y < 0 or y > 127 then dy = -dy end
if millis() % 200 < 20 then
local avg = gap()
usart3_print("ADC(avg)=" .. tostring(avg) .. "\r\n")
end
delay(20)
end