Кратко:
- Можно создавать несколько объектов плагина от одной библиотеки. Например несколько COM портов.
- Загрузка окон QML и плагина сделана как обычное окно приложения. Это даёт возможность сохранения его положения и размещения при перезагрузке.
- Создан новый плагин COM порта. WLSerialPortPlugin2.dll
- Создан объект в скриптах DSTREAM (DataStream) — для формирования и разбора данных (например при работе с COM портом).
- Исправлена работа ручных перемещений. В редких случаях «западало 100%» при частом нажатии на Shift. Выявилось при работе с программой CARAMBA SWITCHER.
- Добавлен тип колонок color(цвет),file(файл),dir(папка) для систем координат, tplace и инструмента. При правке этих колонок будет вызван стандартный диалог.
- Добавлено окно вывода debug данных программы. (которые пишутся в файл)
- Прочие улучшения.
Загрузка плагинов происходит через меню правка >> plugin. У нас появляется окно в котором мы задаём имя объекта (для скрипта и отображения) и ссылка на библиотеку.

Здесь мы создаём 2 объекта для работы с последовательным портом.
Пример окон QML. Аналогично плагинам

Здесь мы создали окно для работы с щупом (WLProbe.qml — идёт в с программой) — использует стоковый скрипт WLProbe.js .Окно корректоров F и окно с тремя кнопками Start Pause Stop (дублируют текущие). https://wldev.ru/data/soft/wlmill/qml/
Прежняя загрузка «через скрипт» в окно Tab также работает. Она удобна для отладки файла qml т.к. не требует перезапуска WLMill.
DSTREAM — новый объект (поток данных) для разбора и создания потока данных. Пример
function ON()
{
//добавляем 2 строки для активации портов 2 и 3
SCRIPT.console("open serial 3 - "+ SERIAL3.open("COM6")+SERIAL3.getErrorStr())
SCRIPT.console("open serial 2 - "+ SERIAL2.open("COM5")+SERIAL2.getErrorStr())
}
function OFF()
{
//добавляем 2 строки для отключения портов 2 и 3
SERIAL3.close()
SERIAL2.close()
}
function senMessage() //отправляем сообщение
{
DSTREAM.clear() //очищаем
DSTREAM.writeString("Happy New Year!") //добавляем строку
DSTREAM.writeInt16(2026) //добавляем число типа int 16 бит
DSTREAM.addCRC16() //добавляем контрольную сумму
SCRIPT.console("send Serial: "+ SERIAL2.sendData(DSTREAM.getData())) //отправляем в SERIAL2
}
function readDataSerialPort(name) //принимаем и разбираем
{
SCRIPT.console("read from: "+name)
DSTREAM.clear()
DSTREAM.setData(SERIAL3.getData()); //устанавливаем данные в поток DSTREAM
if(DSTREAM.checkCRC16()) //если контрольная сумма верна, то разбираем пакет
{
SERIAL3.clearRecive();
SCRIPT.console("from Serial: "+DSTREAM.readString()+" "+DSTREAM.readInt16())//читаем сначала строку, затем число. как и при отправке.
}
}
Также можно создавать и свой поток данных. используя new DataStream()
function senMessage() //отправляем сообщение
{
var my = new DataStream()
my.writeString("Happy New Year!") //добавляем строку
my.writeInt16(2026) //добавляем число типа int 16 бит
my.addCRC16() //добавляем контрольную сумму
SCRIPT.console("send Serial: "+ SERIAL2.sendData(my.getData())) //отправляем в SERIAL2
}
function readDataSerialPort(name) //принимаем и разбираем
{
SCRIPT.console("read from: "+name)
var my = new DataStream(SERIAL3.getData()) //устанавливаем данные в поток DSTREAM
if(DSTREAM.checkCRC16()) //если контрольная сумма верна, то разбираем пакет
{
SERIAL3.clearRecive();
SCRIPT.console("from Serial: "+my.readString()+" "+my.readInt16())//читаем сначала строку, затем число. как и при отправке.
}
}

