<< Click to Display Table of Contents >> Navigation: Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Библиотеки функций > Библиотека MODBUS > Функции работы по MODBUS |
К этим функциям относятся следущие:
modbus.ReadHoldingRegistersAsInt16
modbus.ReadHoldingRegistersAsUInt16
modbus.ReadHoldingRegistersAsInt32
modbus.ReadHoldingRegistersAsUInt32
modbus.ReadHoldingRegistersAsFloat
modbus.ReadHoldingRegistersAsDouble
modbus.ReadInputRegistersAsInt16
modbus.ReadInputRegistersAsUInt16
modbus.ReadInputRegistersAsInt32
modbus.ReadInputRegistersAsUInt32
modbus.ReadInputRegistersAsFloat
modbus.ReadInputRegistersAsDouble
Параметры данных функций – Address, Count, ChangeBytes, StringChangeBytes:
Address – адрес регистра;
Count – количество элементов данного типа;
ChangeBytes – разрешение (true) или запрет (false) использования перестановки байт, заданной параметром StringChangeBytes. Если указано false, то берется чередование "10325476".
StringChangeBytes – обязательно 8 неповторяющихся байт (0-7).
Пример
local w={}
local err
err,w = modbus.ReadHoldingRegistersAsInt16(1000,6,true,"10325476");
--err: true – ошибка, false – ошибки нет
К этим функциям относятся следущие:
modbus.WriteHoldingRegistersAsInt16
modbus.WtiteHoldingRegistersAsUInt16
modbus.WriteHoldingRegistersAsInt32
modbus.WriteHoldingRegistersAsUInt32
modbus.WriteHoldingRegistersAsFloat
modbus.WriteHoldingRegistersAsDouble
Параметры данных функций – Address, Count, ChangeBytes, StringChangeBytes, Cmd6, Buf:
Address – адрес регистра;
Count – количество элементов данного типа;
ChangeBytes – разрешение (true) или запрет (false) использования перестановки байт, заданной параметром StringChangeBytes;
StringChangeBytes – обязательно 8 неповторяющихся байт (0-7);
Cmd6 – использовать (true) или не использовать (false) команду 6;
Buf – массив значений.
Пример
--записать 2 значения int16 с адреса 1 c
--перестановкой байт, не используя команду 6
local w={}
local err
w[1]=5; w[2]=7;
err = modbus.WriteHoldingRegistersAsInt16(1,2,true,"10325476",false,w);
--err: true – ошибка, false – ошибки нет
К этим функциям относятся следующие:
modbus.ReadDiscreteInputs
modbus.ReadCoils
Параметры данных функций – Address, Count:
Address – адрес регистра;
Count – количество элементов данного типа.
Пример
local w={}
local err
err,w = modbus.ReadDiscreteInputs(0,6);
--err: true – ошибка, false – ошибки нет
К этим функциям относятся следущие:
modbus.WriteCoils
Параметры данных функций – Address, Count, Buf:
Address – адрес регистра;
Count – количество элементов данного типа;
Buf – массив значений.
Пример
local w={}
local err
w[1]=true;w[2]=false;
--записать 2 значения c адреса 1
err = modbus.WriteCoils(1,2,w);
--err: true – ошибка, false – ошибки нет
К этим функциям относятся следущие:
modbus.ReadHoldingRegistersAsString
modbus.ReadInputRegistersAsString
Параметры данных функций – Address, Count, TypeString:
Address – адрес регистра;
Count – количество считываемых байтов;
TypeString – 0 – ASCII, 1 – HEX.
StringChangeBytes – 2 байта (0 и 1) определяющих чередование байт в каждом регистре принимаемой строки.
Пример
local err,s
err,s = modbus.ReadHoldingRegistersAsString(2000,30,0,"01");
--err: true – ошибка, false – ошибки нет
К этим функциям относятся следущие:
modbus.WriteHoldingRegistersAsString
Параметры данных функций – Address, Count, TypeString, String:
Address – адрес регистра;
Count – количество записываемых байтов из строки String;
TypeString – 0 – ASCII, 1 – HEX;
String – строка.
StringChangeBytes – 2 байта (0 и 1) определяющих чередование байт в каждом регистре принимаемой строки.
Пример
local err
err = modbus.WriteHoldingRegistersAsString(2000,10,0,"String133","01");
--err: true – ошибка, false – ошибки нет
Посылает отформатированную последовательность байт в MODBUS-устройство. Скрипт должен находиться на уровне узла (TCP/IP или COM). Адрес устройства берется из текущего устройства.
Входные аргументы:
1 – код функции (65-72);
2 – количество элементов в исходной таблице;
3 – таблица масок форматирования;
4 – исходная таблица;
5 – таблица масок принимаемых данных или nil.
Формат маски выходных преобразований – String1:String2, где String1 – формат данных, String2 – строка перестановки. Форматы данных – string, byte, int16, uint16, int32, uint32, float, double. Форматы string и byte не требуют строки перестановки, для остальных форматов, ecли строка перестановки не введена, используется "10325476".
Формат маски входных преобразований – String1:String2:String3, где String1 – формат данных, String2 – количество принимаемых чисел, String3 – строка перестановки байт (для форматов с префиксом s – количество байт для получения числа с указанным форматом). Форматы данных – string, byte, int16, uint16, int32, uint32, float, double, sint32, sdouble (форматы sint32 и sdouble требуют строки количества байт вместо строки перестановки байт).
Если маски преобразований не определены, то байты передаются из таблиц и принимаются в таблицы без преобразований.
Если маска входных преобразований исчерпана, а в приемном буфере еще есть байты, то оставшиеся байты преобразуются в одну символьную строку приемной таблицы.
Возвращаемые значения:
1 – код ошибки; если 0 – ошибок нет;
2 – таблица, каждый элемент которой равен байту из приемного буфера (если маска преобразований не определена) или числу/строке в соответствии с маской преобразований;
3 – количество элементов в таблице.
Коды ошибок:
-1 – ошибка таймаута;
01 – принятый код функции не может быть обработан на подчиненном;
02 – адрес данных, указанный в запросе, не доступен данному подчиненному;
03 – величина, содержащаяся в поле данных запроса, является недопустимой величиной для подчиненного;
04 – невосстанавливаемая ошибка имела место, пока подчиненный пытался выполнить затребованное действие;
05 – подчиненный принял запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет главного от генерации ошибки таймаута;
06 – подчиненный занят обработкой команды. Главный должен повторить сообщение позже, когда подчиненный освободится;
07 – подчиненный не может выполнить программную функцию, принятую в запросе. Этот код возвращается для неудачного программного запроса, использующего функции с номерами 13 или 14. Главный должен запросить диагностическую информацию или информацию об ошибках с подчиненного;
08 – подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. Главный может повторить запрос, но обычно в таких случаях требуется ремонт.
Дополнительные коды ошибок для COM:
12 – принято недостаточно байт за данный таймаут;
11 – ошибка контрольной суммы.
Пример 1
Функция посылает следующую строку байт:
01 41 00 01 00 02 00 00 31 32 33 34 04 B9 FA
local srcdata = {1,2,"1234",4}
local srcmask = {"int16:10","int32:1032","string","byte"}
local srclen = 4
local dstdata = {}
err,dstdata,dstlen = modbus.ExtFunction(65,srclen,srcmask,srcdata,nil,nil);
Пример 2
Функция принимает следующие 2 числа float, представленные в символьном формате:
+05.000+04.235
local srcdata = {1,2,4}
local srcmask = {"int16:10","int32:1032","byte"}
local srclen = 3
local dstdata = {}
local dstmask = {"sdouble:2:7"}
err,dstdata,dstlen = modbus.ExtFunction(65,srclen,srcmask,srcdata,dstmask);
--посылка 01 41 00 01 00 02 00 00 04 C3 36
if err == 0 then
if dstlen == 2 then
--dstdata[1] будет равно 5
--dstdata[2] будет равно 4.235
end
end
Функция предназначена для считывания из устройства записей по функции 0x14. Функция считывает запись из файла и возвращает несколько таблиц, отформатированных по заданным маскам. Таким образом, при чтении можно разбить полученную запись на несколько таблиц различной структуры.
Входные аргументы функции:
1 – количество получаемых из записи таблиц;
2 – таблица с номерами считываемых файлов. Таблица должна содержать столько номеров файлов, сколько задано количество получаемых таблиц;
3 – таблица с номерами считываемых записей. Таблица должна содержать столько номеров записей, сколько задано количество получаемых таблиц;
4 – массив количества принимаемых элементов для каждой получаемой таблицы. Таблица должна содержать столько элементов, сколько задано количество получаемых таблиц;
5 – таблица таблиц масок (если принимается более одной таблицы). Таблица должна содержать столько таблиц масок, сколько задано количество получаемых таблиц.
Возвращаемые значения:
1 – код ошибки:
•0 - ошибки нет;
•-1 - нет связи, нет ответа от контроллера;
•1 - 8 - код исключения возвращенный устройством (3 байт в ответе).
•10 - пустой ответ (нет байтов в поле данных).
2..N – принятые таблицы значений, отформатированные по заданным маскам. Количество принимаемых таблиц задается пользователем.
В примере рассматривается чтение двух записей – 1 и 10 из файла 1.
local err,dstlen --объявление переменных
local file = {1,1} --объявление и инициализация таблицы файлов
local rec = {1,10} --объявление и инициализация таблицы записей
local len = {5,5} --объявление и инициализация таблицы количества принимаемых элементов для каждой из принимаемых таблиц
local dstdata = {} --объявление таблицы для принятия данных из записи 1
local dstdata2= {} –-объявление таблицы для принятия данных из записи 10
local dstmsk1 = {"int16:5:10"} --маска первой таблицы (для записи 1). Тип значения Int16, количество элементов – 5, чередование старшим байтов вперед
local dstmsk2 = {"int16:5:10"} -- маска второй таблицы (для записи 2). Тип значения Int16, количество элементов – 5, чередование старшим байтов вперед
local dstmsk = {dstmsk1,dstmsk2} --создание таблицы таблиц с масками
--чтение архива из устройства
err,dstdata,dstdata2 = modbus.ReadFileFunction(2,file,rec,len,dstmsk);
--если ошибки нет
if err == 0 then
--то выводим в журнал сообщения с полученными значениями
server.Message("d1 ",dstdata[1],",",dstdata[2],",",dstdata[3],",",dstdata[4]);
server.Message("d2 ",dstdata2[1],",",dstdata2[2],",",dstdata2[3],",",dstdata2[4]);
else
server.Message("error");
end