АБАК ПЛК
Руководство по настройке и программированию
×

Настройка библиотеки 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).
Онлайн помощь создана в Dr.Explain