Да, все верно.
Да, все верно.
Спасибо.
Добрый день.
В Руководстве по языку Lua 5.1 для MasterOPC Universal Modbus Server написано, что функция server.SendAndReceiveDataByMask в скрипте должна находиться на уровне узла (узла COM). В руководстве пользователя
при реализации собственных протоколов приведен пример для протокола Rnet, где данная функция расположена в теге.
Или я что-то путаю. Как сделать правильно? Правильно ли будет разместить эту функцию в скрипте узла, расчет CRC в скрипте устройства, а в тегах все остальное?
Добрый день!
Не работает функция err,buf,len = server.SendAndReceiveData(srcbuf,srclen,dstlen).
Вот код в теге:
function OnRead()
-- инициилизация устройства
local send={1,2,3,4,5,6}; --кадр запроса
local Length=table.maxn(send); --вычисление длины запроса в байтах
local srcbuf="";
srcbuf=server.TableToString(send); --байты данных строки для посылки
server.Message("srcbuf-данные для передачи ",srcbuf);
local srclen=table.maxn(send); --количество байт данных с учетом байта CRC
server.Message("srclen-длина данных в байтах ",srclen);
local dstlen=20; --длина принимаемых данных
local err,len;
local buf="";
--запрос к устройству
server.Message("srcbuf-данные для передачи окончательные",srcbuf);
server.Message("srclen-длина данных в байтах окончательная ",srclen);
err,buf,len = server.SendAndReceiveData(srcbuf,srclen,dstlen); --посылаем и принимаем байты от устройства
--[[Входные параметры: srcbuf-данные для передачи, srclen-длина данных в байтах, dstlen-длина принимаемых данных.
err=TRUE при ошибке выполнения функции, buf – строка с принятыми данными (nil, если приема не было),
len – длина buf.--]]
--принят ответ. Проверим контрольную сумму
end
Вот лог:
[02.01.2017 18:23:51.230] Inf : Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.2.20
[02.01.2017 18:23:51.231] Inf : Server:Cтарт конфигурации C:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\OPC_PRIBOR.mbp
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srcbuf-данные для передачи 123456
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srclen-длина данных в байтах 6
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srcbuf-данные для передачи окончательные123456
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srclen-длина данных в байтах окончательная 6
[02.01.2017 18:23:51.247] Inf : ПортCOM:Порт 1 открыт
[02.01.2017 18:23:51.247] TRACE : (COM1) Tx: [0006] 06 01 31 01 32 01
[02.01.2017 18:24:02.356] Inf : ПортCOM:Порт 1 закрыт
[02.01.2017 18:24:02.769] Inf : Server:Завершение работы
В порт уходят другие данные. В чем проблема не понятно.
Выше пример без CRC:
local srclen=table.maxn(send); --количество байт данных
Если нужно посылать в порт числа, то лучше использовать sendandrecivedatabymask.
Ознакомьтесь с этой документацией:
http://www.insat.ru/products/Univers...ver_API_UG.pdf
Спасибо.
Добрый день!
Да, server.SendAndReceiveDataByMask() работает. Хотел упростить себе задачу и не использовать
маски преобразования. Поэтому решил использовать server.SendAndReceiveData.
Тогда в каких случаях используется функция server.SendAndReceiveData, все-таки интересно?
И еще вопрос.
Код из примера:
local err,len,lenbuf;
local bufs=""; --строка принятых байт
err,dest,len,bufs,lenbuf=server.SendAndReceiveData ByMask...
Т.е. bufs - строка принятых байт. Раз это строка, то ее вроде можно сразу отправить на подсчет CRC.
Но в примере строку преобразуем в таблицу, а таблицу опять в строку для отправки на подсчет CRC:
--преобразование из строки в таблицу байт
local buf={}; --таблица принятых байт
for i = 1, lenbuf, 1 do
table.insert (buf,string.byte(bufs,i));
end
s = server.TableToString(buf); --вызов функции для подсчета контрольной суммы CRC=server.RunFunctionFromDevice("CRCsum",1,s,lenb uf-1); и т.д.
И вот строка s получается с нормальными данными, полученными от устройства.
И на самом деле, без этого двойного преобразования не работает. Принятые данные local bufs="" - не понятно что.
Т.е. получается - понятие "строка" имеет разные значения ?
Имеется ли к Modbus Universal MasterOPC Server конфигурация на Промышленный датчик (преобразователь) влажности и температуры воздуха ОВЕН ПВТ100? Ссылка на конфигурации для различных устройств на сайте insat.ru не работает.
Спасибо.
Данный аргумент - это строка из всех символом принятых байт.
Для подсчета контрольной суммы, как правило, нужно использовать массив байт. А массивы между узлами не передаются, поэтому и преобразуются в строку. Посмотрите в документации пример 4 документации.
Готовой конфигурации нет, но учитывая что там всего 10 регистров, вы можете легко сделать ее самостоятельно штатными функциями сервера
Спасибо.