Функции работы по MODBUS

<< Click to Display Table of Contents >>

Navigation:  Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Библиотеки функций > Библиотека MODBUS >

Функции работы по MODBUS

Функции работы по MODBUS

mbul_mail Аналоговое чтение

mbul_mail Аналоговая запись

mbul_mail Дискретное чтение

mbul_mail Дискретная запись

mbul_mail Чтение строк

mbul_mail Запись строк

mbul_mail modbus.ExtFunction

mbul_mail modbus.ReadFileFunction

Аналоговое чтение

К этим функциям относятся следущие:

mbul   modbus.ReadHoldingRegistersAsInt16

mbul   modbus.ReadHoldingRegistersAsUInt16

mbul   modbus.ReadHoldingRegistersAsInt32

mbul   modbus.ReadHoldingRegistersAsUInt32

mbul   modbus.ReadHoldingRegistersAsFloat

mbul   modbus.ReadHoldingRegistersAsDouble          

mbul   modbus.ReadInputRegistersAsInt16

mbul   modbus.ReadInputRegistersAsUInt16

mbul   modbus.ReadInputRegistersAsInt32

mbul   modbus.ReadInputRegistersAsUInt32

mbul   modbus.ReadInputRegistersAsFloat

mbul   modbus.ReadInputRegistersAsDouble

Параметры данных функций – Address, Count, ChangeBytes, StringChangeBytes:

mbul   Address – адрес регистра;

mbul   Count – количество элементов данного типа;

mbul   ChangeBytes – разрешение (true) или запрет (false) использования перестановки байт, заданной параметром StringChangeBytes. Если указано false, то берется чередование "10325476".

mbul   StringChangeBytes – обязательно 8 неповторяющихся байт (0-7).

Пример

local w={}

local err

err,w = modbus.ReadHoldingRegistersAsInt16(1000,6,true,"10325476");

--err: true – ошибка, false – ошибки нет

Аналоговая запись

К этим функциям относятся следущие:

mbul   modbus.WriteHoldingRegistersAsInt16

mbul   modbus.WtiteHoldingRegistersAsUInt16

mbul   modbus.WriteHoldingRegistersAsInt32

mbul   modbus.WriteHoldingRegistersAsUInt32

mbul   modbus.WriteHoldingRegistersAsFloat

mbul   modbus.WriteHoldingRegistersAsDouble

Параметры данных функций – Address, Count, ChangeBytes, StringChangeBytes, Cmd6, Buf:

mbul   Address – адрес регистра;

mbul   Count – количество элементов данного типа;

mbul   ChangeBytes – разрешение (true) или запрет (false) использования перестановки байт, заданной параметром StringChangeBytes;

mbul   StringChangeBytes – обязательно 8 неповторяющихся байт (0-7);

mbul   Cmd6 – использовать (true) или не использовать (false) команду 6;

mbul   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 – ошибки нет

Дискретное чтение

К этим функциям относятся следующие:

mbul   modbus.ReadDiscreteInputs

mbul   modbus.ReadCoils

Параметры данных функций – Address, Count:

mbul   Address – адрес регистра;

mbul   Count – количество элементов данного типа.

Пример

local w={}

local err

err,w = modbus.ReadDiscreteInputs(0,6);

--err: true – ошибка, false – ошибки нет

Дискретная запись

К этим функциям относятся следущие:

mbul   modbus.WriteCoils

Параметры данных функций – Address, Count, Buf:

mbul   Address – адрес регистра;

mbul   Count – количество элементов данного типа;

mbul   Buf – массив значений.

Пример

local w={}

local err

w[1]=true;w[2]=false;

--записать 2 значения c адреса 1

err = modbus.WriteCoils(1,2,w);

--err: true – ошибка, false – ошибки нет

Чтение строк

К этим функциям относятся следущие:

mbul   modbus.ReadHoldingRegistersAsString

mbul   modbus.ReadInputRegistersAsString

Параметры данных функций – Address, Count, TypeString:

mbul   Address – адрес регистра;

mbul   Count – количество считываемых байтов;

mbul   TypeString – 0 – ASCII, 1 – HEX.

mbul   StringChangeBytes – 2 байта (0 и 1) определяющих чередование байт в каждом регистре принимаемой строки.

Пример

local err,s

err,s = modbus.ReadHoldingRegistersAsString(2000,30,0,"01");

--err: true – ошибка, false – ошибки нет

Запись строк

К этим функциям относятся следущие:

mbul   modbus.WriteHoldingRegistersAsString

Параметры данных функций – Address, Count, TypeString, String:

mbul   Address – адрес регистра;

mbul   Count – количество записываемых байтов из строки String;

mbul   TypeString – 0 – ASCII, 1 – HEX;

mbul   String – строка.

mbul   StringChangeBytes – 2 байта (0 и 1) определяющих чередование байт в каждом регистре принимаемой строки.

Пример

local err

err = modbus.WriteHoldingRegistersAsString(2000,10,0,"String133","01");

--err: true – ошибка, false – ошибки нет

modbus.ExtFunction

Посылает отформатированную последовательность байт в MODBUS-устройство. Скрипт должен находиться на уровне узла (TCP/IP или COM). Адрес устройства берется из текущего устройства.

Входные аргументы:

mbul   1 – код функции (65-72);

mbul   2 – количество элементов в исходной таблице;

mbul   3 – таблица масок форматирования;

mbul   4 – исходная таблица;

mbul   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 требуют строки количества байт вместо строки перестановки байт).

Если маски преобразований не определены, то байты передаются из таблиц и принимаются в таблицы без преобразований.

Если маска входных преобразований исчерпана, а в приемном буфере еще есть байты, то оставшиеся байты преобразуются в одну символьную строку приемной таблицы.

Возвращаемые значения:

mbul   1 – код ошибки; если 0 – ошибок нет;

mbul   2 – таблица, каждый элемент которой равен байту из приемного буфера (если маска преобразований не определена) или числу/строке в соответствии с маской преобразований;

mbul   3 – количество элементов в таблице.

Коды ошибок:

mbul   -1 – ошибка таймаута;

mbul   01 – принятый код функции не может быть обработан на подчиненном;

mbul   02 – адрес данных, указанный в запросе, не доступен данному подчиненному;

mbul   03 – величина, содержащаяся в поле данных запроса, является недопустимой величиной для подчиненного;

mbul   04 – невосстанавливаемая ошибка имела место, пока подчиненный пытался выполнить затребованное действие;

mbul   05 – подчиненный принял запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет главного от генерации ошибки таймаута;

mbul   06 – подчиненный занят обработкой команды. Главный должен повторить сообщение позже, когда подчиненный освободится;

mbul   07 – подчиненный не может выполнить программную функцию, принятую в запросе. Этот код возвращается для неудачного программного запроса, использующего функции с номерами 13 или 14. Главный должен запросить диагностическую информацию или информацию об ошибках с подчиненного;

mbul   08 – подчиненный пытается читать расширенную память, но обнаружил ошибку паритета. Главный может повторить запрос, но обычно в таких случаях требуется ремонт.

Дополнительные коды ошибок для COM:

mbul   12 – принято недостаточно байт за данный таймаут;

mbul   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

                       

modbus.ReadFileFunction

Функция предназначена для считывания из устройства записей по функции 0x14. Функция считывает запись из файла и возвращает несколько таблиц, отформатированных по заданным маскам. Таким образом, при чтении можно разбить полученную запись на несколько таблиц различной структуры.

Входные аргументы функции:

mbul   1 – количество получаемых из записи таблиц;

mbul   2 – таблица с номерами считываемых файлов. Таблица должна содержать столько номеров файлов, сколько задано количество получаемых таблиц;

mbul   3 – таблица с номерами считываемых записей. Таблица должна содержать столько номеров записей, сколько задано количество получаемых таблиц;

mbul   4 – массив количества принимаемых элементов для каждой получаемой таблицы. Таблица должна содержать столько элементов, сколько задано количество получаемых таблиц;

mbul   5 – таблица таблиц масок (если принимается более одной таблицы). Таблица должна содержать столько таблиц масок, сколько задано количество получаемых таблиц.

Возвращаемые значения:

mbul   1 – код ошибки:

0 - ошибки нет;

-1 - нет связи, нет ответа от контроллера;

1 - 8 - код исключения возвращенный устройством (3 байт в ответе).

10 - пустой ответ (нет байтов в поле данных).

mbul   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