Ультрамед Оборудование для автоматизации
+7 (952) 934‑80‑00 ultramed@proultramed.ru Новосибирск, Троллейная 87/1

Lua API

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)
Помни о ресурсе перезаписи Flash. Не цикли запись без необходимости.

Общий входной буфер

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

Навигация

Ошибки аргументов: invalid port/pin, color out of range, flash out of range / misaligned — обрабатываются как исключения Lua.