Настройка библиотеки MBMasterCUP.library
MBMasterCUP.library – библиотека для реализации работы протоколов Modbus TCP и Modbus RTU в режиме клиент/мастер.
Назначение библиотеки
Библиотека предназначена для организации опроса устройств по протоколам MODBUS RTU или MODBUS TCP.
Описание библиотеки
Библиотека состоит из трех основных частей:
-
Функциональный блок канала MBChannel.
-
Базовый функциональный блок устройства MBUnit.
-
Функциональный блок опроса регистров устройства MBPoll.
Функциональный блок канала MBChannel организует канал связи по протоколу RTU или TCP, к каналу связи подключаются устройства Unit, устройства содержат блоки опроса регистров устройства MBPoll.
Входные переменные
|
Имя
|
Тип
|
Описание
|
|
xEnable
|
BOOL
|
Включить канал
|
|
Protocol
|
USINT
|
Тип протокола: 0 – RTU, 1 – TCP
|
|
InAddress
|
STRING
|
IP-адрес
|
|
InPort
|
UINT
|
Номер IP-порта
|
|
ComPort
|
USINT
|
Номер COM-порта
|
|
Baudrate
|
DWORD
|
Скорость:
4800, 9600, 19200, 38400, 57600, 115200
|
|
Stopbit
|
BYTE
|
Стоп биты: 1 – 1 bit, 2 – 1.5 bit, 3 – 2 bit
|
|
Parity
|
BYTE
|
Четность: 0 – NO, 1 – ODD, 2 – EVEN
|
|
DelayBetween
|
UDINT
|
Задержка между запросами, мс
|
|
NumberTry
|
USINT
|
Количество повторных запросов
|
|
TimeoutUnit
|
TIME
|
Таймаут ответа устройства
|
|
TimeReconChan
|
TIME
|
Период переподключения канала
|
|
TimeResetPoll
|
TIME
|
Период автосброса ошибок блоков опроса
|
|
AutoResetPoll
|
BOOL
|
Автосброс ошибок блоков опроса включен
|
Вход xEnable предназначен для включения канала связи.
Входы IpAddress, IpPort предназначены настройки сокета Ethernet при использовании протокола TCP, входы ComPort, Baudrate, Stopbit, Parity предназначены для настройки последовательного порта при использовании протокола RTU.
Вход DelayBetween предназначен для задания задержки между запросами.
Вход NumberTry определяет количество повторных попыток связи при возникновении ошибки в блоке опроса. Переменная TimeoutUnit определяет время ожидания канала ответа на запрос, по истечении времени происходит повторный запрос. При возникновении ошибок в блоке опроса и превышении количества повторных попыток блок опроса исключается из очереди для устранения потерь времени канала при обращении к неисправному устройству. Для возобновления опроса необходимо в пользовательском приложении сбросить выход ошибки или в настройках канала активировать вход AutoResetPoll. Тогда с периодом времени TimeResetPoll будет происходить сброс ошибок и постановка блока опроса в очередь опроса.
При возникновении ошибок открытия канала и ошибок приема-передачи активируется выход xError, код ошибки канала можно видеть в переменной eError. При наличии неустранимых ошибок канала происходит повторная инициализации канала через период времени TimeReconChan.
Выходные переменные
|
Имя
|
Тип
|
Описание
|
|
xOutEnable
|
BOOL
|
Канал включен
|
|
xBusy
|
BOOL
|
Канал занят выполнением запроса
|
|
xError
|
BOOL
|
Ошибка канала
|
|
eError
|
BYTE
|
Код ошибки канала
|
|
NumberRequests
|
BYTE
|
Количество запросов на канале
|
|
CurRequest
|
BYTE
|
Текущий выполняемый запрос
|
|
DiagUnExecut
|
USINT
|
Количество неисправленных запросов
|
|
DiagNumError
|
USINT
|
Количество блоков с ошибкой на канале
|
|
DiagPollErr
|
ARRAY [0..255] OF USINT
|
Массив кодов ошибок по блокам опроса
|
|
DiagRequest
|
ARRAY [0.255] OF BOOL
|
Массив активных запросов
|
|
DiagLagTime
|
ARRAY [0..255] OF TIME
|
Массив времени обработки запросов
|
|
DiagWaitTime
|
TIME
|
Текущее время ожидания ответа
|
Выход xOutEnable активируется при удачном открытии канала. Выход xBusy активируется при выполнении обмена по каналу. Выход xError активируется при наличии ошибки канала, код ошибки канала можно видеть в переменной eError. В переменной NumberRequests отображается количество подключенных к каналу блоков опроса MBPoll, в переменной CurRequest номер исполняемого в данный момент времени запроса.
Переменные DiagUnExecut, DiagNumError, DiagPollErr, DiagRequest, DiagLagTime, DiagWaitTime – диагностические переменные, облегчающие процесс настройки связи с устройством. У массивов DiagPollErr, DiagRequest, DiagLagTime в качестве индекса массива использован номер очереди блока опроса.
Метод AddUnit
Входные переменные
|
Имя
|
Тип
|
Описание
|
|
pUnit
|
POINTER TO MBUnit
|
Указатель на блок устройства
|
|
UnitId
|
BYTE
|
ID устройства
|
Метод предназначен для добавления всех блоков опроса MBPoll устройства Unit в очередь канала MBChannel.
Метод возвращает TRUE при успешном выполнении.
Очередь канала не переполнена (максимальная емкость: 255 элементов). Задан корректный Modbus ID устройства (UnitId в диапазоне от 1 до 247). Количество блоков опроса для устройства больше нуля.
Входные параметры:
pUnit – адрес функционального блока (ФБ) подключаемого устройства.
UnitId – Modbus ID подключаемого устройства.
При вызове метода все элементы массива блоков опроса устройства последовательно обрабатываются, при этом проверяется наличие блока опроса в очереди для исключения повторных подключений.
Метод DelUnit
Входные переменные
|
Имя
|
Тип
|
Описание
|
|
UnitId
|
BYTE
|
ID устройства
|
Метод предназначен для удаления блоков опроса из очереди канала. Выход метода принимает значение TRUE, если указан корректный ID (диапазон от 1 до 247). В переменной UnitId указывается Modbus ID удаляемого устройства. При вызове метода все элементы массива блоков опроса с указанным ID удаляются из очереди канала.
Базовый функциональный блок устройства Unit
Базовый функциональный блок Unit предназначен для подключения блоков опроса MBPoll.
Входные переменные
|
Имя
|
Тип
|
Описание
|
|
xEnable
|
BOOL
|
Включить устройство
|
|
AdrBase
|
BOOL
|
Базовая адресация 0 или 1
|
|
SwapByte
|
BOOL
|
Режим чередования байт
|
|
SwapWord
|
BOOL
|
Режим чередования слов
|
|
SwapDword
|
BOOL
|
Режим чередования двойных слов
|
|
NumberPoll
|
BYTE
|
Количество блоков опроса
|
Вход xEnable предназначен для включения канала связи. Его сброс приводит к исключению блоков опроса из очереди канала и сбросу ошибок этих блоков.
Переменные содержат следующие параметры конфигурации:
AdrBase – определяет систему адресации подключаемого устройства:
0 – физическая адресация (адреса начинаются с 0);
1 – логическая адресация (адреса начинаются с 1).
SwapByte, SwapWord, SwapDWord – флаги чередования байт, слов и двойных слов при операциях чтения (Get) или записи (Set) данных из/в буфер. Например:
Для стандартных Modbus-устройств: 1, 0, 0;
Для устройств с порядком байт Big-Endian: 1, 1, 1.
NumberPoll – количество блоков опроса MBPoll, используемое при подключении устройства методом AddUnit к каналу MBChannel.
Входные переменные
|
Имя
|
Тип
|
Описание
|
|
xError
|
BOOL
|
Ошибка устройства
|
Выход xError активируется, когда в одном из блоков опроса MBPoll устройства возникает ошибка опроса регистров.
Базовый блок Unit содержит массив блоков опроса регистров MBPoll (255 блоков).
Пользовательский функциональный блок устройств
Пользовательский функциональный блок для обработки данных из Modbus-регистров устройства создается пользователем как расширение базового блока (EXTENDS MBUnit). При подключении устройства Unit к каналу с помощью метода AddUnit все настроенные элементы массива MBPoll этого устройства помещаются в очередь опроса канала.
Метод GetLreal
|
Имя
|
Тип
|
Описание
|
|
MBPoll
|
MBPoll
|
Блок опроса
|
|
NumReg
|
WORD
|
Номер регистра для чтения
|
Метод предназначен для чтения данных типа LREAL из буфера чтения блока опроса MBPoll устройства. Параметр NumReg задаёт адрес регистра в Modbus-таблице подключенного устройства. Возвращаемое значение метода имеет тип LREAL.
Методы GetReal, GetLword, GetDword, GetWord, GetBool.
Данные методы аналогичны методу GetLreal и предназначены для чтения данных соответствующих типов.
Метод GetString
Предназначен для чтения строковой переменной (тип STRING). Принимает входной параметр Length, определяющий длину данных в количестве регистров Modbus.
Метод SetLreal
Входные переменные
|
Имя
|
Тип
|
Описание
|
|
MBPoll
|
MBPoll
|
Блок опроса
|
|
NumReg
|
WORD
|
Номер регистра для чтения
|
|
Data
|
LREAL
|
Данные для записи
|
Метод предназначен для записи данных типа LREAL в буфер записи. В переменной NumReg указывается адрес Modbus регистра из таблицы регистров подключенного устройства. В переменную Data записывается значение типа LREAL.
Методы SetReal, SetLword, SetDword, SetWord, SetBool
Методы аналогичны методу SetLreal. Предназначены для записи данных соответствующих форматов.
Метод SetString
Предназначен для записи переменной типа STRING, дополнительно имеет входную переменную Length в которой содержится длина переменной в количестве Modbus регистров.
Блок опроса регистров MBPoll
Блок предназначен для организации опроса регистров подключенного устройства. Является составной частью блока Unit.
Входные переменные
|
Имя
|
Тип
|
Описание
|
|
xExec
|
BOOL
|
Выполнение блока
|
|
FuncCode
|
BYTE
|
Поддерживаемые коды функций Modbus:
1 – чтение регистров COILS;
2 – чтение регистров DISCRETE INPUTS;
3 – чтение регистров HOLDING REGISTERS;
4 – чтение регистров INPUTS;
5 – запись одного регистра COILS;
6 – запись одного регистра HOLDING REGISTERS;
15 – запись регистров COILS;
16 – запись регистров HOLDING REGISTERS;
23 – чтение/запись регистров HOLDING REGISTERS
|
|
AddressRead
|
UINT
|
Адрес регистра для чтения
|
|
QuantityRead
|
UINT
|
Количество регистров чтения
|
|
AddressWrite
|
UINT
|
Адрес регистра для записи
|
|
QuantityWrite
|
UINT
|
Количество регистров записи
|
|
RequestTime
|
TIME
|
Время между запросами
|
|
WriteChanges
|
BOOL
|
Запись по изменению данных
|
|
CleaningData
|
BOOL
|
Очистка данных при ошибке чтения
|
|
WriteData
|
ARRAY [0..122] OF WORD
|
Данные для записи
|
|
RequestAccept
|
BOOL
|
Подтверждения запроса на исполнение
|
|
RequestComplete
|
BOOL
|
Запрос завершен
|
|
AddressBase
|
BOOL
|
Базовый адрес регистров 0 или 1
|
|
LagTime
|
TIME
|
Время выполнения запроса
|
|
ErrCode
|
BYTE
|
Код ошибки
|
|
ExcepCode
|
BYTE
|
Код исключения протокола
|
Вход xExec предназначен для активации блока опроса. В переменной FuncCode указывается код функции Modbus из списка: 1, 2, 3, 4, 5, 6, 15, 16, 23. В переменной AddressRead для чтения регистров указывается начальный адрес Modbus регистра из таблицы регистров подключенного устройства, в QuantityRead количество регистров (не более 125 типа WORD и не более 2000 типа BOOL). В переменной AddressWrite для записи регистров указывается начальный адрес модбас регистра из таблицы регистров подключенного устройства, в QuantityWrite количество регистров (не более 123 типа WORD, не более 121 для 23 функции и не более 1968 типа BOOL). В переменной RequestTime указывается период выполнения запроса. Переменная WriteChanges активируется, если необходим режим автоматической записи при изменении записываемых данных, при этом вход xExec должен быть не активным. Переменная CleaningData активируется, если необходим режим сброса данных чтения при ошибке опроса.
Массив WriteData предназначен для хранения записываемых данных, запись в массив осуществляется при вызове методов типа Set.
Переменные RequestAccept, RequestComplete, AddressBase, ErrCode, ExcepCode предназначены для внутреннего взаимодействия ФБ MBChannel с MBPoll.
В соответствии с LagTime – фактическим временем выполнения запроса каналом – корректируется время вежду запросами RequestTime.
Выходные переменные
|
Имя
|
Тип
|
Описание
|
|
xBusy
|
BOOL
|
Блок занят выполнением
|
|
xDone
|
BOOL
|
Данные получены
|
|
xError
|
BOOL
|
Ошибка
|
|
eError
|
BYTE
|
Код ошибки выполнения запроса
|
|
eExcep
|
BYTE
|
Код исключения протокола
|
|
ReadData
|
ARRAY [0..124] OF WORD
|
Данные для чтения
|
|
ExecuteRequest
|
BOOL
|
Запрос на выполнение
|
Выход xBusy активируется в момент обработки запроса. Выход xDone активируется при поступлении новых данных и выполнении запроса без ошибок. Выход xError активируется при наличии ошибки обработки запроса, код ошибки канала можно видеть в переменной eError. Массив ReadData предназначен для хранения читаемых данных, чтение из массива осуществляется при вызове методов типа Get.
Переменная ExecuteRequest предназначена для внутреннего взаимодействия ФБ MBChannel и MBPoll, активируется при возникновении запроса на обновление данных.
Метод Acknow
Метод предназначен для подтверждения чтения данных, сбрасывает выходную переменную xDone.
Метод Reset
Метод предназначен для сброса ошибок блока опроса, сбрасывает выходные переменные eError, eExcep.
Использование библиотеки
Пользователем создается ФБ обработки данных устройства UserUnit на основе MBUnit как расширение базового блока (EXTENDS MBUnit). В базовом блоке MBUnit уже объявлен массив блоков опроса регистров MBPoll (255 блоков).
FUNCTION_BLOCK UserUnit EXTENDS MBUnit
VAR
Init: BOOL := TRUE;
END_VAR
IF Init THEN
Settings();
Init := FALSE;
END_IF
При инициализации ФБ UserUnit должно быть предусмотрено действие Settings с первоначальной настройкой блоков опроса регистров. В настройку устройства может включаться настройка базового адреса устройства и признаков чередования бай, слов, двойных слов.
Действие Settings:
SwapByte := 1; // Смена байт
MBPoll[0].FuncCode := 3; // Чтение регистров
MBPoll[0].AddressRead := 16#1020;
MBPoll[0].QuantityRead := 80;
MBPoll[0].RequestTime := T#1S;
MBPoll[1].FuncCode := 16; // Запись регистров
MBPoll[1].AddressWrite := 16#2000;
MBPoll[1].QuantityWrite := 6;
MBPoll[1].RequestTime := T#10S;
Пользователем в ФБ UserUnit заполняются настройки блоков MBPoll начиная с нулевого элемента массива, без пропуска элементов массива. При подключении устройства к каналу опроса методом AddUnit подсчитывается количество элементов массива NumberPoll с заполненным корректным кодом функции Modbus. Элементы массива, начиная элемента с незаполненным кодом функции не участвуют в подключении к каналу. Метод AddUnit подключения к каналу должен вызываться после настройки блоков опроса MBPoll, входящих в состав пользовательского устройства, для корректного подсчета количества блоков опроса NumberPoll в составе устройства Unit.
Настройки блока опроса динамические, их можно менять при выполнении программы.
В пользовательском приложении создается ФБ MBChanels, объявляются экземпляры каналов опроса MBChannel. Объявляются пользовательские ФБ обработки данных Modbus устройств UserUnit.
FUNCTION_BLOCK MBChannels
VAR
ChannelA: MBChannel; // Менеджер канала A
ChannelB: MBChannel; // Менеджер канала B
Unit1: UserUnit; // Модбас устройство 1
Unit2: UserUnit; // Модбас устройство 2
Unit3: UserUnit; // Модбас устройство 3
Unit4: UserUnit; // Модбас устройство 4
Unit5: UserUnit; // Модбас устройство 5
Init: BOOL := TRUE;
END_VAR
Каждый экземпляр MBChannel привязан к одному из COM портов или к IP-адресу устройства. На один COM порт может быть привязан только один канал, к одному IP адресу множество каналов. Каналы работают независимо друг от друга, осуществляют параллельный опрос подключенных устройств.
Заводится действие Settings, в котором описывается первоначальная настройка канала.
IF Init THEN
Settings();
Init := FALSE;
END_IF
Действие Settings:
// Настройка каналов
ChannelA.Protocol := 0;
ChannelA.ComPort := 1;
ChannelA.Timeout := T#200MS;
ChannelA.Baudrate := 9600;
ChannelB.Protocol := 1;
ChannelB.IpAddress := '192.168.110.78';
ChannelB.IpPort := 502;
ChannelB.Timeout := T#100MS;
// Подключение устройств к каналам
ChannelA.AddUnit(ADR(Modbus.MBChannels.Unit1),UnitId := 1);
ChannelA.AddUnit(ADR(Modbus.MBChannels.Unit2),UnitId := 2);
ChannelB.AddUnit(ADR(Modbus.MBChannels.Unit3),UnitId := 1);
ChannelB.AddUnit(ADR(Modbus.MBChannels.Unit4),UnitId := 2);
ChannelB.AddUnit(ADR(Modbus.MBChannels.Unit5),UnitId := 3);
Здесь канал A настроен на COM1, канал B настроен на IP-адрес. При изменении параметров настройки канала следует произвести инициализацию канала, то есть отключить и снова включить канал.
При инициализации ФБ MBChanels должно быть предусмотрено подключение устройств к каналам. Устройства при подключении должны предварительно настроены.
Здесь к каналу A подключено 2 устройства, к каналу B подключено 3 устройства.
Во время работы программы методами DelUnit и AddUnit можно отключать и подключать устройства от каналов, то есть, например, отключить устройство Unit5 от канала B (TCP) и подключить к каналу A (RTU).
В ФБ пользователя Unit управление блоком опроса осуществляется через вход xExec. По фронту активации входа происходит однократное выполнение запроса, во время исполнения запроса активируется выход xBusy, при успешном выполнении запроса активируется выход xDone, при ошибке активируется выход xExec. Вход xExec после выполнения сбрасывается.
Для того, чтобы быть уверенным в актуальности считанных данных и для экономии времени процессора, чтение из буфера чтения следует производить в момент активации выхода xDone. Если такой задачи не стоит, то можно производить чтение данных без анализа выхода xDone. После успешного чтения данных выход xDone можно сбросить методом Acknow.
IF MBPoll[1].xDone THEN // Если данные прочитаны успешно
MBPoll[1].Acknow(); // Подтверждение чтения
VAR1 := GetWord (MBPoll[0],16#1020); // Чтение данных типа WORD
VAR2 := GetWord (MBPoll[0],16#1021); // Чтение данных типа WORD
VAR3 := GetDword(MBPoll[0],16#1022); // Чтение данных типа DWORD
VAR4 := GetReal (MBPoll[0], 16#1024); // Чтение данных типа REAL
VAR5 := GetLword(MBPoll[0],16#1026); // Чтение данных типа LWORD
VAR6 := GetLreal(MBPoll[0], 16#1030); // Чтение данных типа LREAL
END_IF
Здесь данные из устройства считаны из устройства одним блоком опроса модбас регистров MBPoll, вне зависимости от типа данных.
Пользователь имеет возможность организовать опрос по событиям, активируя в нужный момент времени вход xExec или циклический опрос регистров. Если постоянно держать активным вход xExec, то происходит периодическое выполнение запроса с периодом RequestTime. Если при настройке блока опроса активировать вход WriteChanges, то будет происходить выполнение запроса на запись при изменении данных в буфере записи методами Set, запись будет происходить без активации входа xExec. Также реакция на ошибки может определятся пользователем. При появлении критической ошибки опрос останавливается, для продолжения опроса необходимо в пользовательском приложении сбросить выход ошибки. Можно в настройках канала активировать вход AutoResetPoll, тогда с периодом времени TimeResetPoll будет происходить сброс ошибок и возобновление опроса.
Пользовательский код приложения можно упростить, производя чтение и запись данных без анализа каких-либо условий в каждом цикле выполнения приложения. Для этого нужно активировать вход выполнения xExec, сброс ошибок AutoResetPoll, и запись при изменениях WriteChanges. Для индикации отсутствия связи можно включить сброс данных при ошибках CleaningData.
Ошибки выполнения
При выполнении блоков MBChannel и MBPoll происходят ошибки, коды ошибок приведены в таблице. Ошибки сгруппированы по источнику возникновения.
-
Ошибки запроса – это ошибки, связанные с формированием запроса, возникают при неправильном указании пользователем кода функции, количества регистров.
-
Ошибки приема ответа возникают при разборе ответа подключенного устройства.
-
Ошибки канала приема/передачи возникают при отсутствии интерфейса связи или физического его отказа. Ошибки возникают в канале, передаются в блок опроса.
Ошибки канала и приема ответа (код более 16#90) вызывают повторные запросы и, после накопления повторов, приводят к остановке выполнения запросов.
Ошибка исключения протокола Modbus (код 16#80) – это ошибки, которые содержатся в коде исключения eExcep согласно спецификации протокола Modbus, формируются подключенным устройством. При наличии этой ошибки обработка ее должна быть предусмотрена в ФБ пользователя. Код предупреждения для методов чтения Get или записи Set данных появляется, когда адрес регистра в методе чтения Get или записи Set не входит в поле адресов ни одного блока опроса MBPoll устройства Unit. Это предупреждение означает, что при составлении пользователем программы обработки данных устройства допущена ошибка задания адресов.
|
Код
|
Описание
|
|
Ошибки запроса
| |
|
128
|
16#80 Ошибка исключения протокола Modbus
|
|
129
|
16#81 Ошибка создания запроса (неправильный код функции или количество регистров)
|
|
130
|
16#82 Ошибка разбора ответа (неправильный код функции)
|
|
131
|
16#83 Ошибка адреса чтения (метод Get)
|
|
132
|
16#84 Ошибка адреса записи (метод Set)
|
|
Ошибки приема ответа
| |
|
145
|
16#91 Не совпадает ID устройства
|
|
146
|
16#92 Не совпадает код функции Modbus
|
|
147
|
16#93 Неверная контрольная сумма
|
|
148
|
16#94 Ошибка транзакции (чужой ответ)
|
|
149
|
16#95 Ошибка таймаута
|
|
Ошибки канала приема/передачи
| |
|
161
|
16#A1 Ошибка открытия канала
|
|
162
|
16#A2 Ошибка передачи
|
|
163
|
16#A3 Ошибка приема
|
Пример использования с комментариями приведен в AbakController_v1.0.4.0.package в шаблонном проекте ABAKPLC_examples.project (устройство ex_MBMasterCUP_Modbus).