Модуль 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!