Модуль NetModbus содержит:
_con_NetModbus.inc константы
_var_NetModbus.inc переменные
_fun_NetModbus.inc функции
относящиеся к семейству протоколов MODBUS,
включая MODBUS IP, MODBUS RTU, MODBUS ASCII.
Библиотека используется, например, в сервере ModbusSrv.
Константы:
//
// Источники:
// 1) MODBUS Application Protocol Specification V1.1b.
// 2) MODBUS Messaging on TCP/IP Implementation Guide V1.0b.
// 3) MODBUS over serial line specification and implementation guide V1.02.
//
modbus_MinUnitId = Минимальный Unit Id (адрес устройства) согласно спецификации
modbus_MaxUnitId = Максимальный Unit Id (адрес устройства) согласно спецификации
modbus_MaxPduLen = Максимальный размер блока PDU (Protocol Data Unit)
modbus_MaxRtuLen = Максимальный размер кадра RTU
modbus_MaxAscLen = Максимальный размер кадра ASCII
modbus_MaxCSGet = Максимальное число Coil Status за одно чтение $07D0, F1
modbus_MaxISGet = Максимальное число Input Status за одно чтение $07D0, F2
modbus_MaxIRGet = Максимальное число Input Register за одно чтение $007D, F3
modbus_MaxHRGet = Максимальное число Holding Register за одно чтение $007D, F4
modbus_MaxCSPut = Максимальное число Coil Status за одну запись $07B0, F15
modbus_MaxHRPut = Максимальное число Holding Register за одну запись $007B, F16
modbus_0xFF00 = Константа $FF00 для включения Single Coil
modbus_sc_on = Константа $FF00 для включения Single Coil
modbus_sc_off = Константа $0000 для отключения Single Coil
modbus_fn_ReadCS = Функция MODBUS: Read Coil Statuses
modbus_fn_ReadIS = Функция MODBUS: Read Input Statuses
modbus_fn_ReadHR = Функция MODBUS: Read Holding Registers
modbus_fn_ReadIR = Функция MODBUS: Read Input Registers
modbus_fn_WritSC = Функция MODBUS: Write Single Coil
modbus_fn_WritSR = Функция MODBUS: Write Single Register
modbus_fn_ReadES = Функция MODBUS: Read Exception Status
modbus_fn_Diagn = Функция MODBUS: Diagnostics
modbus_fn_EvCnt = Функция MODBUS: Get Comm Event Counter
modbus_fn_EvLog = Функция MODBUS: Get Comm Event Log
modbus_fn_WritMC = Функция MODBUS: Write Multitle Coils
modbus_fn_WritMR = Функция MODBUS: Write Multiple Registers
modbus_fn_RepSID = Функция MODBUS: Report Slave ID
modbus_fn_ReadFR = Функция MODBUS: Read File Record
modbus_fn_WritFR = Функция MODBUS: Write File Record
modbus_fn_MaskWR = Функция MODBUS: Mask Write Register
modbus_fn_ReWrMR = Функция MODBUS: Read-Write Multiple Regs
modbus_fn_ReadFQ = Функция MODBUS: Read FIFO Queue
modbus_fn_Escape = Функция MODBUS: Encapsul.Interf.Transp.
modbus_er_OK = Код ошибки MODBUS: OK, no errors
modbus_er_ILLFUN = Код ошибки MODBUS: ILLEGAL FUNCTION
modbus_er_ILLADR = Код ошибки MODBUS: ILLEGAL DATA ADDRESS
modbus_er_ILLVAL = Код ошибки MODBUS: ILLEGAL DATA VALUE
modbus_er_EXCEPT = Код ошибки MODBUS: exception mask
//
// Вспомогательные константы:
//
modbus_er_BADLEN = Код ошибки MODBUS: плохая длина блока ADU/PDU
modbus_er_BADCRC = Код ошибки MODBUS: плохая контрольная сумма CRC/LRC
modbus_er_BADUID = Код ошибки MODBUS: плохой номер (адрес) модуля Unit Id
modbus_er_BADCMD = Код ошибки MODBUS: плохой идентификатор команды
modbus_er_BADREF = Код ошибки MODBUS: плохая ссылка
modbus_MaxWord = максимальное значение int16 $FFFF
modbus_pr_IP = Идентификатор протокола MODBUS IP
modbus_pr_RTU = Идентификатор протокола MODBUS RTU
modbus_pr_ASCII = Идентификатор протокола MODBUS ASCII
modbus_pr_NAMES = Список имен протоколов MODBUS = 'IP,RTU,ASCII'
modbus_pr_ALIAS = Список псевдонимов протоколов MODBUS = 'TCP,RTU,ASC'
modbus_sw_native = Режим перестановки байтов (SwapMode) - машинный, без перестановки байтов
modbus_sw_normal = Режим перестановки байтов (SwapMode) - нормальный (сетевой, от старших к младшим байтам),
зависит от архитектуры компьютера, для x86 - перестановка байтов, слов и двойных слов
ModbusProxy = имя прокси сервера &ModbusProxy
Большинство констант взято из официальной спецификации протокола MODBUS.
Переменные:
modbus_errno = код последней ошибки Modbus
modbus_MaxCSAddr = максимальный адрес Coil Status, адресация с нуля, по умолчанию $FFFF
modbus_MaxISAddr = максимальный адрес Input Status, адресация с нуля, по умолчанию $FFFF
modbus_MaxIRAddr = максимальный адрес Input Register, адресация с нуля, по умолчанию $FFFF
modbus_MaxHRAddr = максимальный адрес Holding Register, адресация с нуля, по умолчанию $FFFF
devModbusProxy = ссылка прокси сервера &ModbusProxy
cmd_NetModbusPoll = идентификатор команды @Modbus.Poll
cmd_NetModbusReply = идентификатор команды @Modbus.Reply
cmd_NetModbusTimeout = идентификатор команды @Modbus.Timeout
cmd_NetModbusRefuse = идентификатор команды @Modbus.Refuse
hid_NetModbusCrc = идентификатор хеш-функции для расчета контрольной суммы MODBUS/RTU CRC
hid_NetModbusLrc = идентификатор хеш-функции для расчета контрольной суммы MODBUS/ASCII LRC
function modbus_get_tag(tag:Integer;def:Real):Real;
Извлекает значение тега «tag» (integer или real), либо возвращает значение по умолчанию «def», если тег нулевой.
function modbus_set_tag(tag:Integer; val:Real):Boolean;
Записывает значение тега «tag» (integer или real).
function modbus_inc_tag(tag:Integer; inc:Real):Boolean;
Прибавляет к значению тега «tag» величину «inc».
procedure modbus_fixerror(tag,code:Integer; msg:String);
Фиксирует ошибку, инкрементируя тег «tag» или счетчик ошибок с кодом «code», затем выдает консольное сообщение «msg».
function modbus_swap_int16(w:Integer):Integer;
Меняет местами байты в int16 числе «w».
function modbus_swap2(dat:String; SwapMode:Integer):String;
function modbus_swap4(dat:String; SwapMode:Integer):String;
function modbus_swap8(dat:String; SwapMode:Integer):String;
Вспомогательные функции, меняют местами байты, 16-битные и 32-битные слова в строке данных «dat» в соответствии с битами «SwapMode».
В протоколе MODBUS принят за норму порядок передачи чисел Big-Endian (передача от старших значащих байтов чисел к младшим).
На машинах с другой архитектурой может понадобиться перестановка байтов.
Рекомендуется использовать константу «modbus_sw_normal».
function modbus_dump_int16(dat:Integer; SwapMode:Integer):String;
function modbus_dump_int32(dat:Integer; SwapMode:Integer):String;
function modbus_dump_float(dat:Real; SwapMode:Integer):String;
function modbus_dump_double(dat:Real; SwapMode:Integer):String;
Извлекает содержимое (двоичный дамп) числа «dat» с перестановкой байтов, 16- и 32-битных слов в соответствии с битами «SwapMode».
Бит 0 - перестановка байтов, бит 1 - перестановка 16-битных слов, бит 2 - перестановка 32-битных слов.
Эти функции нужны при обработке данных MODBUS с учетом того, что порядок байтов клиента и сервера может быть различным.
В протоколе MODBUS принят за норму порядок передачи чисел Big-Endian (передача от старших значащих байтов чисел к младшим).
На машинах с другой архитектурой может понадобиться перестановка байтов.
Рекомендуется использовать константу «modbus_sw_normal».
function modbus_take_int16(dat:String; SwapMode:Integer):Integer;
function modbus_take_int32(dat:String; SwapMode:Integer):Integer;
function modbus_take_float(dat:String; SwapMode:Integer):Real;
function modbus_take_double(dat:String; SwapMode:Integer):Real;
Извлекает число из двоичного дампа данных «dat» с перестановкой байтов, 16- и 32-битных слов в соответствии с битами «SwapMode».
Бит 0 - перестановка байтов, бит 1 - перестановка 16-битных слов, бит 2 - перестановка 32-битных слов.
Эти функции нужны при обработке данных MODBUS с учетом того, что порядок байтов клиента и сервера может быть различным.
В протоколе MODBUS принят за норму порядок передачи чисел Big-Endian (передача от старших значащих байтов чисел к младшим).
На машинах с другой архитектурой может понадобиться перестановка байтов.
Рекомендуется использовать константу «modbus_sw_normal».
function modbus_addr_ok(addr:Integer):Boolean;
Проверяет допустимость адреса устройства «addr»=(1..247).
function modbus_func_ok(func:Integer):Boolean;
Проверяет допустимость функции «func»=(1,2,3,4,5,6,15,16).
Это список поддерживаемых библиотекой функций MODBUS.
function modbus_prot_ok(prot:Integer):Boolean;
Проверяет допустимость идентификатора протокола «prot»=(1,2,3).
function modbus_prot_name(prot:Integer):String;
Возвращает строку идентификатора протокола «prot» - (IP,RTU,ASCII).
function modbus_prot_alias(prot:Integer):String;
Возвращает строку псевдонима протокола «prot» - (TCP,RTU,ASC).
function modbus_prot_byname(name:String):Integer;
Возвращает идентификатор протокола по имени «name» (IP,RTU,ASCII) или псевдониму (TCP,RTU,ASC).
function modbus_calc_lrc(buf:String):Integer;
Вычисляет контрольную сумму LRC (Longitudinal Redundancy Checking) данных «buf» для протокола MODBUS ASCII.
Алгоритм расчета зависит от значения переменной hid_NetModbusLrc, которая инициализируется при старте как
hid_NetModbusLrc:=iValDef(ParamStr('HasherCode ModbusLrc'),-1);
При положительном значении переменной вычисляется быстрым алгоритмом
modbus_calc_lrc:=HashIndexOf(buf,0,hid_NetModbusLrc)При отрицательном значении (hid_NetModbusLrc=-1) вычисляется более медленным алгоритмом, написанном на DaqPascal (старая версия).
function modbus_calc_crc(buf:String):Integer;
Вычисляет контрольную сумму CRC16 (Cyclical Redundancy Checking) данных «buf» для протокола MODBUS RTU.
Алгоритм расчета зависит от значения переменной hid_NetModbusCrc, которая инициализируется при старте как
hid_NetModbusCrc:=iValDef(ParamStr('HasherCode Crc16Modbus'),-1);
При положительном значении переменной вычисляется быстрым алгоритмом
modbus_calc_crc:=HashIndexOf(buf,0,hid_NetModbusCrc)При отрицательном значении (hid_NetModbusCrc=-1) вычисляется более медленным алгоритмом, написанном на DaqPascal (старая версия).
function modbus_join_lrc(dat:String):String;
Присоединяет контрольную сумму LRC к строке данных «dat».
function modbus_join_crc(dat:String):String;
Присоединяет контрольную сумму CRC16 к строке данных «dat».
function modbus_encode_ip(tid,pid,uid,fid:Integer; dat:String):String;
Кодирует сообщение протокола MODBUS IP из составляющих (см. описание протокола MODBUS).
«tid» - номер транзакции (инкрементируется после каждой транзакции).
«pid» - идентификатор протокола (ожидается 1).
«uid» - номер (адрес) модуля (ожидается 1..247).
«fid» - номер функции (ожидается 1,2,3,4,5,6,15,16).
«dat» - данные, формат которых зависит от номера функции «fid».
Функция возвращает ADU (Application Data Unit), объединив заголовок (MBAP) и блок данных протокола PDU=(fid+dat).
Результат вызова - строка, готовая к пересылке по протоколу MODBUS IP.
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_decode_ip(adu:String; var tid,pid,uid,fid:Integer; var dat:String):Integer;
Декодирует сообщение «adu» протокола MODBUS IP, выделяя из него составляющие (см. описание протокола MODBUS).
При неверном формате сообщения возвращает 0 или отрицательный код ошибки (т.е. код ошибки со знаком минус).
При успешном декодировании возвращает положительную длину PDU=«fid+dat» блока данных протокола (protocol data unit),
а также номер транзакции «tid», протокол «pid», адрес модуля «uid», номер функции «fid» и данные «dat», формат которых зависит от значения «fid».
Полученный блок данных протокола PDU=«fid+dat» может дальше декодироваться с помощью вызова «modbus_decode_pdu».
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_encode_rtu(uid,fid:Integer; dat:String):String;
Кодирует сообщение протокола MODBUS RTU из составляющих (см. описание протокола MODBUS).
«uid» - номер (адрес) модуля (ожидается 1..247).
«fid» - номер функции (ожидается 1,2,3,4,5,6,15,16).
«dat» - данные, формат которых зависит от номера функции «fid».
Функция возвращает ADU (Application Data Unit), объединив заголовок «uid», блок данных протокола PDU=«fid+dat» и контрольную сумму (CRC16).
Результат вызова - строка, готовая к пересылке по протоколу MODBUS RTU.
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_decode_rtu(adu:String; var uid,fid:Integer; var dat:String):Integer;
Декодирует сообщение adu протокола MODBUS RTU, выделяя из него составляющие (см. описание протокола MODBUS).
При неверном формате сообщения возвращает 0 или отрицательный код ошибки (т.е. код ошибки со знаком минус).
При успешном декодировании возвращает положительную длину PDU=«fid+dat» блока данных протокола (protocol data unit),
а также адрес модуля «uid», номер функции «fid» и данные «dat», формат которых зависит от значения «fid».
Полученный блок данных протокола PDU=«fid+dat» может дальше декодироваться с помощью вызова «modbus_decode_pdu».
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_encode_ascii(uid,fid:Integer; dat:String):String;
Кодирует сообщение протокола MODBUS ASCII из составляющих (см. описание протокола MODBUS).
«uid» - номер (адрес) модуля (ожидается 1..247).
«fid» - номер функции (ожидается 1,2,3,4,5,6,15,16).
«dat» - данные, формат которых зависит от номера функции «fid».
Функция возвращает ADU (Application Data Unit), объединив стартовый символ «:», заголовок «uid»,
блок данных протокола PDU=«fid+dat», контрольную сумму (LRC) и разделитель (CRLF). Данные кодируются в HEX формате.
Результат вызова - строка, готовая к пересылке по протоколу MODBUS ASCII.
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_decode_ascii(adu:String; var uid,fid:Integer; var dat:String):Integer;
Декодирует сообщение протокола MODBUS RTU, выделяя из него составляющие (см. описание протокола MODBUS).
При неверном формате сообщения возвращает 0 или отрицательный код ошибки (т.е. код ошибки со знаком минус).
При успешном декодировании возвращает положительную длину PDU=«fid+dat» блока данных протокола (protocol data unit),
а также адрес модуля «uid», номер функции «fid» и данные «dat», формат которых зависит от значения «fid».
Полученный блок данных протокола PDU=«fid+dat» может дальше декодироваться с помощью вызова «modbus_decode_pdu».
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_encode_adu(tid,pid,uid,fid:Integer; dat:String):String;
Кодирует сообщение протокола MODBUS IP/RTU/ASCII из составляющих (см. описание протокола MODBUS).
«tid» - номер транзакции (инкрементируется после каждой транзакции).
«pid» - идентификатор протокола (ожидается 1=IP,2=RTU,3=ASCII).
«uid» - номер (адрес) модуля (ожидается 1..247).
«fid» - номер функции (ожидается 1,2,3,4,5,6,15,16).
«dat» - данные, формат которых зависит от номера функции «fid».
Функция выполняет вызов modbus_encode_ip, modbus_encode_rtu, modbus_encode_ascii в зависимости от протокола «pid»
и возвращает ADU (Application Data Unit), объединив заголовок, блок данных протокола PDU=«fid+dat» и контрольные суммы.
Результат вызова - строка, готовая к пересылке по протоколу MODBUS IP/RTU/ASCII.
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_decode_adu(adu:String; prot:Integer; var tid,pid,uid,fid:Integer; var dat:String):Integer;
Декодирует сообщение «adu» протокола MODBUS IP/RTU/ASCII, в зависимости от протокола «prot» выделяя из него составляющие (см. описание протокола MODBUS).
При неверном формате сообщения возвращает 0 или отрицательный код ошибки (т.е. код ошибки со знаком минус).
При успешном декодировании возвращает положительную длину PDU=«fid+dat» блока данных протокола (protocol data unit),
а также считанный из сообщения номер транзакции «tid», протокол «pid», адрес модуля «uid», номер функции «fid» и данные «dat», формат которых зависит от значения функции «fid».
Полученный блок данных протокола PDU=«fid+dat» может дальше декодироваться с помощью вызова «modbus_decode_pdu».
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_is_except(fid:Integer):Boolean;
Проверяет наличие бита (128) исключения (is exception) в коде функции «fid» (см. описание протокола MODBUS).
Возвращает True если бит исключения установлен. Бит исключения служит признаком ошибки в ответах на запросы.
function modbus_un_except(fid:Integer):Integer;
Сбрасывает бит исключения (unset exception) в коде функции «fid» (см. описание протокола MODBUS).
Возвращает код функции «fid» без бита исключения, который сброшен в 0.
Служит для анализа кодов функций в ответах на запросы.
function modbus_as_except(fid:Integer; isOn:Boolean):Integer;
Устанавливает бит исключения (assign exception) в коде функции «fid» (см. описание протокола MODBUS).
Возвращает код функции «fid» с битом исключения, который установлен или сброшен в зависимости от параметра «isOn».
Служит для анализа кодов функций в ответах на запросы.
function modbus_encode_pdu(dir:Char; fid:Integer; saddr,quant:Integer; raw:String):String;
Кодирует блок данных PDU протокола MODBUS из составляющих (см. описание протокола MODBUS).
«dir» - direction, код направления передачи ('R'=Request=Запрос,'A'=Answer=Ответ от модуля).
«fid» - function id, номер функции (ожидается 1,2,3,4,5,6,15,16).
«saddr» - start address, начальный (считая от нуля) адрес регистров для пересылки.
«quant» - quantity, количество данных (число регистров) для пересылки в многорегистровых функциях (1,2,3,4,15,16) .
При записи single coil (отдельного статуса в функции 5) число quantity должно содержать 0=modbus_sc_off или $FF00=modbus_sc_on.
При записи single register (отдельного регистра в функции 6) число quantity должно содержать значение регистра.
«raw» - массив "сырых" данных читаемых или записываемых регистров,
размер и формат которых зависит от значения функции «fid» и направления передачи «dir»,
либо код ошибки при ошибках-исключениях.
Признаком ошибки-исключения служит наличие бита исключения (128) в коде функции, см. функцию modbus_is_except.
Надо иметь в виду, что некоторые функции не используют "сырые" данные (например 5,6).
Кроме того, "сырые" данные «raw» должны быть согласованы с количеством данных «quant».
Результат вызова - строка dat данных PDU=(fid+dat).
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_decode_pdu(dir:Char; fid:Integer; dat:String; var saddr,quant:Integer; var raw:String):Integer;
Декодирует блок данных PDU=«fid+dat» (protocol data unit) протокола MODBUS, выделяя из него составляющие (см. описание протокола MODBUS)
в зависимости от значения направления передачи «dir» ('R'=Request=Запрос,'A'=Answer=Ответ от модуля).
При неверном формате блока данных возвращает 0 или отрицательный код ошибки (т.е. код ошибки со знаком минус).
При успешном декодировании возвращает положительную длину PDU=«fid+dat» блока данных протокола (protocol data unit),
а также считанный из блока данных адрес регистра «saddr», количество регистров «quant» и "сырые" данные «raw»,
размер и формат которых зависит от значения функции «fid» и направления передачи «dir».
Блок данных PDU не зависит от протокола передачи (IP/RTU/ASCII) и определяется лишь свойствами опрашиваемого модуля (устройства).
Стартовый адрес «saddr» и количество регистров «quant» используются для адресации при чтении и записи данных.
Строка «raw» содержит массив "сырых" данных читаемых или записываемых регистров, либо код ошибки при ошибках-исключениях.
Признаком ошибки-исключения служит наличие бита исключения (128) в коде функции, см. функцию modbus_is_except.
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_ext_byte(raw:String; byteoffs:Integer):Integer;
Извлекает (extract) данные типа byte (фактически unsigned integer 8 bit в виде Integer) из строки "сырых" данных «raw»
с адресом - смещением (offset) регистра «byteoffs», заданным в байтах от начала массива «raw».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Используется для интерпретации данных.
function modbus_ext_int16(raw:String; regoffs,SwapMode:Integer):Integer;
Извлекает (extract) данные типа int16 (фактически unsigned integer 16 bit в виде Integer) из строки "сырых" данных «raw»
с адресом - смещением (offset) регистра «regoffs» и режимом перестановки байтов/слов «SwapMode».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Важно ометить, что адрес - смещение регистра «regoffs» считается от нуля и задает смещение в пределах пакета данных «raw».
Чтобы получить реальный адрес регистра PLC, надо добавить к этому смещению стартовый адрес регистра, по которому был сделан запрос.
Кроме того, важно помнить, что это смещение задано в регистрах (16 бит), а не байтах, т.к. MODBUS использует регистровую адресацию.
Подробности см. в описании протокола MODBUS.
function modbus_ext_int32(raw:String; regoffs,SwapMode:Integer):Integer;
Извлекает (extract) данные типа int32 (фактически signed integer 32 bit в виде Integer) из строки "сырых" данных «raw»
с адресом - смещением (offset) регистра «regoffs» и режимом перестановки байтов/слов «SwapMode».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Важно ометить, что адрес - смещение регистра «regoffs» считается от нуля и задает смещение в пределах пакета данных «raw».
Чтобы получить реальный адрес регистра PLC, надо добавить к этому смещению стартовый адрес регистра, по которому был сделан запрос.
Кроме того, важно помнить, что это смещение задано в регистрах (16 бит), а не байтах, т.к. MODBUS использует регистровую адресацию.
Подробности см. в описании протокола MODBUS.
function modbus_ext_uint32(raw:String; regoffs,SwapMode:Integer):Real;
Извлекает (extract) данные типа uint32 (фактически unsigned integer 32 bit в виде Real) из строки "сырых" данных «raw»
с адресом - смещением (offset) регистра «regoffs» и режимом перестановки байтов/слов «SwapMode».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Важно ометить, что адрес - смещение регистра «regoffs» считается от нуля и задает смещение в пределах пакета данных «raw».
Чтобы получить реальный адрес регистра PLC, надо добавить к этому смещению стартовый адрес регистра, по которому был сделан запрос.
Кроме того, важно помнить, что это смещение задано в регистрах (16 бит), а не байтах, т.к. MODBUS использует регистровую адресацию.
Подробности см. в описании протокола MODBUS.
function modbus_ext_float(raw:String; regoffs,SwapMode:Integer):Real;
Извлекает (extract) данные типа float (фактически 32 bit IEEE-754 в виде Real) из строки "сырых" данных «raw»
с адресом - смещением (offset) регистра «regoffs» и режимом перестановки байтов/слов «SwapMode».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Важно ометить, что адрес - смещение регистра «regoffs» считается от нуля и задает смещение в пределах пакета данных «raw».
Чтобы получить реальный адрес регистра PLC, надо добавить к этому смещению стартовый адрес регистра, по которому был сделан запрос.
Кроме того, важно помнить, что это смещение задано в регистрах (16 бит), а не байтах, т.к. MODBUS использует регистровую адресацию.
Подробности см. в описании протокола MODBUS.
function modbus_ext_double(raw:String; regoffs,SwapMode:Integer):Real;
Извлекает (extract) данные типа double (фактически 64 bit IEEE-754 в виде Real) из строки "сырых" данных «raw»
с адресом - смещением (offset) регистра «regoffs» и режимом перестановки байтов/слов «SwapMode».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Важно ометить, что адрес - смещение регистра «regoffs» считается от нуля и задает смещение в пределах пакета данных «raw».
Чтобы получить реальный адрес регистра PLC, надо добавить к этому смещению стартовый адрес регистра, по которому был сделан запрос.
Кроме того, важно помнить, что это смещение задано в регистрах (16 бит), а не байтах, т.к. MODBUS использует регистровую адресацию.
Подробности см. в описании протокола MODBUS.
function modbus_ext_uint64(raw:String; regoffs,SwapMode:Integer):Real;
Извлекает (extract) данные типа uint64 (фактически unsigned int 64 bit в виде Real) из строки "сырых" данных «raw»
с адресом - смещением (offset) регистра «regoffs» и режимом перестановки байтов/слов «SwapMode».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Важно ометить, что адрес - смещение регистра «regoffs» считается от нуля и задает смещение в пределах пакета данных «raw».
Чтобы получить реальный адрес регистра PLC, надо добавить к этому смещению стартовый адрес регистра, по которому был сделан запрос.
Кроме того, важно помнить, что это смещение задано в регистрах (16 бит), а не байтах, т.к. MODBUS использует регистровую адресацию.
Подробности см. в описании протокола MODBUS.
function modbus_ext_coil(raw:String; regoffs:Integer):Integer;
Извлекает (extract) данные типа coil/status (single bit) из строки "сырых" данных «raw» с адресом - смещением (offset) регистра «regoffs».
Предполагается, что "сырые" данные «raw» получены вызовом «modbus_decode_pdu».
Важно ометить, что адрес - смещение регистра «regoffs» считается от нуля и задает смещение в пределах пакета данных «raw».
Чтобы получить реальный адрес регистра PLC, надо добавить к этому смещению стартовый адрес регистра, по которому был сделан запрос.
Кроме того, важно помнить, что это смещение «regoffs» задано в coil-регистрах (1 бит), а не байтах, т.к. MODBUS использует регистровую адресацию.
Подробности см. в описании протокола MODBUS.
function modbus_proxy_poll(cmd:String; ref,cid,tot,port,uid,fid:Integer; dat:String):String;
Используется для подготовки команд @Modbus.Poll, посылаемых в консоль &ModbusProxy, а также ответных команд.
«cmd» - подготавливаемая команда, ожидается @Modbus.Poll, @Modbus.Reply, Modbus.TimeOut или @Modbus.Refuse. При указании пустой строки используется @Modbus.Poll.
«ref» - имя или ссылка устройства, которому будет возвращено ответное сообщение @Modbus.Reply/@Modbus.Refuse/@Modbus.Timeout.
Обычно это devMySelf, то есть ответное сообщение возвращается вызывающему драйверу.
«cid» - command id, любое число для идентификации пользовательской команды, которое возвращается без изменений в ответном сообщении.
«tot» - timeout, ms (0..MaxInt).
«port» - логический порт &ModbusProxy, (1..16).
«uid» - номер (адрес) модуля (ожидается 1..247).
«fid» - номер функции (ожидается 1,2,3,4,5,6,15,16).
«dat» - данные, формат которых зависит от номера функции «fid».
Возвращает отформатированое сообщение, готовое к посылке в консоль &ModbusProxy.
function modbus_proxy_nice(cmd:String; ref,cid,tim,port,uid,fid:Integer; dat:String; wid:Integer):String;
Используется для "приятного" (читабельного) форматирования сообщений и ответов &ModbusProxy.
«cmd» - команда, например, @Modbus.Reply, Modbus.TimeOut или @Modbus.Refuse.
«ref» - reference, имя или ссылка устройства.
«cid» - command id, числовой идентификатор пользовательской команды.
«tim» - время, ms (0..MaxInt).
«port» - логический порт.
«uid» - номер (адрес) модуля.
«fid» - номер функции.
«dat» - данные.
«wid» - width, параметр форматирования.
При wid>0 строка dat отображается в HEX формате и ограничивается по длине величиной wid.
При wid<0 строка dat ограничивается по длине величиной abs(wid).
Возвращает читабельно отформатированную строку для печати.
function modbus_proxy_reply(cmd,arg:String; var ref,cid,tim,port,uid,fid:Integer; var dat:String):Boolean;
Используется для интерпретации ответов на запросы @Modbus.Poll ... , посылаемых &ModbusProxy в консоль драйвера, выполнившего запрос.
«cmd» - принятая из консоли команда, ожидается @Modbus.Reply, Modbus.TimeOut или @Modbus.Refuse.
«arg» - агрументы команды, не менее 7 слов: ref cid tim port uid fid dat.
«ref» - reference, имя или ссылка устройства, пославшего ответ - это должен быть &ModbusProxy.
«cid» - command id, числовой идентификатор пользовательской команды, должен совпадать с посланным.
«tim» - измеренное время запроса-ответа, ms (0..MaxInt).
«port» - логический порт &ModbusProxy, должен совпадать с посланным.
«uid» - номер (адрес) модуля (ожидается 1..247), должен совпадать с посланным.
«fid» - номер функции (ожидается 1,2,3,4,5,6,15,16), должен совпадать с посланным (но может быть установлен бит исключения).
«dat» - данные, формат которых зависит от номера функции «fid».
Возвращает True, если формат команды и аргументов выглядит пригодным для дальнейшей обработки.
Функция также устанавливает код ошибки modbus_errno. Ненулевой код ошибки означает наличие проблем.
function modbus_errmsg(errno:Integer):String;
Используется для интерпретации кодов ошибок.
«errno» - код ошибки, обычно это modbus_errno.
Возвращает текст для сообщения об ошибке.
procedure ClearNetModbus;
procedure InitNetModbus;
procedure FreeNetModbus;
procedure PollNetModbus;
Стандартные процедуры очистки/инициализации/завершения/опроса модуля NetModbus.
Обычно они не вызываются напрямую, а вызываются автоматически из процедур очистки/инициализации/завершения/опроса модуля NetLibrary.
Желаю успешного использования NetModbus!