KRModbusMaster.pas
Константы
- MBM_ERRORS_COUNT – количество ошибок Modbus Master
- mbmeOk – нет ошибки
- mbmeNotConnector – не подключен модуль передачи данных
- mbmeIncorrectID – неверный идентификатор пакета
- mbmeIncorrectPackageLength – неверная длинна пакета
- mbmeCRC – ошибка контрольной суммы
- mbmeIncorrectFunction – неверный номер функции
- mbmeIncorrectMBPackageLength – неверная длинна Modbus пакета
- mbmeIncorrectDataLength – неверная длинна данных
- mbmeQueueOverflowed – очередь переполнена
- mbmeRealTimeError – ошибка времени выполнения
- mbmeModbusNotActive – обработчик протокола Modbus выключен
- mbmeClientNotActive – Modbus клиент выключен
- MB_PARSER_ERRORS_MSG – список сообщений о ошибках
Типы данных
- TMBMCallBack – процедура обратного вызова при получении ответа от сервера
- AError – код ошибки
- AData – указатель, который был передан при отправке пакета в коннектор
Функции
- MBMReadCoils – формирует основную часть запроса Modbus для функции mbfReadCoils
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMReadDiscretInputs – формирует основную часть запроса Modbus для функции mbfReadDiscretInputs
- ADevAddr – адрес устройства
- AStartInput – адрес начального дискретного входа
- ACount – количество дискретных входов
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMReadHoldingRegisters – формирует основную часть запроса Modbus для функции mbfReadHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMReadInputRegisters – формирует основную часть запроса Modbus для функции mbfReadInputRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMReadStatus – формирует основную часть запроса Modbus для функции mbfReadStatus
- ADevAddr – адрес устройства
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMUserFunction – формирует основную часть запроса Modbus для пользовательской(не стандартной) функции
- ADevAddr – адрес устройства
- AFunc – номер функции
- AData – указатель на буфер с данными пакета
- ADataLen – длина пакета данных
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- MBMWriteCoil – формирует основную часть запроса Modbus для функции mbfWriteCoil
- ADevAddr – адрес устройства
- ACoilNum – адрес дискретного регистра
- AData – значение для записи
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMWriteCoils – формирует основную часть запроса Modbus для функции mbfWriteCoils
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- AData – значения для записи
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMWriteHoldingRegister – формирует основную часть запроса Modbus для функции mbfWriteHoldingRegister
- ADevAddr – адрес устройства
- AStartReg – адрес регистра
- AData – значение для записи
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMWriteHoldingRegisters – формирует основную часть запроса Modbus для функции mbfWriteHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- AData – значения для записи
- AFrom – начальный индекс в буфере
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUReadCoils – формирует запрос Modbus RTU для функции mbfReadCoils
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUReadDiscretInputs – формирует запрос Modbus RTU для функции mbfReadDiscretInputs
- ADevAddr – адрес устройства
- AStartInput – адрес начального дискретного входа
- ACount – количество дискретных входов
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUReadHoldingRegisters – формирует запрос Modbus RTU для функции mbfReadHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUReadInputRegisters – формирует запрос Modbus RTU для функции mbfReadInputRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUReadStatus – формирует запрос Modbus RTU для функции mbfReadStatus
- ADevAddr – адрес устройства
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUUserFunction – формирует запрос Modbus RTU для пользовательской(не стандартной) функции
- ADevAddr – адрес устройства
- AFunc – номер функции
- AData – указатель на буфер с данными пакета
- ADataLen – длина пакета данных
- ABuffer – буфер, в который записывается сформированный пакет
- MBMRTUWriteCoil – формирует запрос Modbus RTU для функции mbfWriteCoil
- ADevAddr – адрес устройства
- ACoilNum – адрес дискретного регистра
- AData – значение для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUWriteCoils – формирует запрос Modbus RTU для функции mbfWriteCoils
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- AData – значения для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUWriteHoldingRegister – формирует запрос Modbus RTU для функции mbfWriteHoldingRegister
- ADevAddr – адрес устройства
- AStartReg – адрес регистра
- AData – значение для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMRTUWriteHoldingRegisters – формирует запрос Modbus RTU для функции mbfWriteHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- AData – значения для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPReadCoils – формирует запрос Modbus TCP для функции mbfReadCoils
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPReadDiscretInputs – формирует запрос Modbus TCP для функции mbfReadDiscretInputs
- ADevAddr – адрес устройства
- AStartInput – адрес начального дискретного входа
- ACount – количество дискретных входов
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPReadHoldingRegisters – формирует запрос Modbus TCP для функции mbfReadHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPReadInputRegisters – формирует запрос Modbus TCP для функции mbfReadInputRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPReadStatus – формирует запрос Modbus TCP для функции mbfReadStatus
- ADevAddr – адрес устройства
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPUserFunction – формирует запрос Modbus TCP для пользовательской(не стандартной) функции
- ADevAddr – адрес устройства
- AFunc – номер функции
- AData – указатель на буфер с данными пакета
- ADataLen – длина пакета данных
- ABuffer – буфер, в который записывается сформированный пакет
- MBMTCPWriteCoil – формирует запрос Modbus TCP для функции mbfWriteCoil
- ADevAddr – адрес устройства
- ACoilNum – адрес дискретного регистра
- AData – значение для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPWriteCoils – формирует запрос Modbus TCP для функции mbfWriteCoils
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- AData – значения для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPWriteHoldingRegister – формирует запрос Modbus TCP для функции mbfWriteHoldingRegister
- ADevAddr – адрес устройства
- AStartReg – адрес регистра
- AData – значение для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMTCPWriteHoldingRegisters – формирует запрос Modbus TCP для функции mbfWriteHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- AData – значения для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIReadCoils – формирует запрос Modbus ASCII для функции mbfReadCoils
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIReadDiscretInputs – формирует запрос Modbus ASCII для функции mbfReadDiscretInputs
- ADevAddr – адрес устройства
- AStartInput – адрес начального дискретного входа
- ACount – количество дискретных входов
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIReadHoldingRegisters – формирует запрос Modbus ASCII для функции mbfReadHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIReadInputRegisters – формирует запрос Modbus ASCII для функции mbfReadInputRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIReadStatus – формирует запрос Modbus ASCII для функции mbfReadStatus
- ADevAddr – адрес устройства
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIUserFunction – формирует запрос Modbus ASCII для пользовательской(не стандартной) функции
- ADevAddr – адрес устройства
- AFunc – номер функции
- AData – указатель на буфер с данными пакета
- ADataLen – длина пакета данных
- ABuffer – буфер, в который записывается сформированный пакет
- MBMASCIIWriteCoil – формирует запрос Modbus ASCII для функции mbfWriteCoil
- ADevAddr – адрес устройства
- ACoilNum – адрес дискретного регистра
- AData – значение для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIWriteCoils – формирует запрос Modbus ASCII для функции mbfWriteHoldingRegister
- ADevAddr – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- AData – значения для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIWriteHoldingRegister – формирует запрос Modbus ASCII для функции mbfWriteHoldingRegister
- ADevAddr – адрес устройства
- AStartReg – адрес регистра
- AData – значение для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- MBMASCIIWriteHoldingRegisters – формирует запрос Modbus ASCII для функции mbfWriteHoldingRegisters
- ADevAddr – адрес устройства
- AStartReg – адрес начального регистра
- AData – значения для записи
- ABuffer – буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
Классы
Класс TKRModbusMaster
Родительский класс TComponent
TKRModbusMaster – клиентская части протокола Modbus. Формирует пакет набора стандартных функций протокола с последующей отправкой на Slave-устройство. Полученный ответ проверяет на наличие ошибок и разбивает на составные части.
Свойства класса TKRModbusMaster
- Active – включение/выключение
- QueueCount – количество пакетов в очереди на отправку. Свойство только для чтения
- Connector – подключение модуля для передачи данных
- WaitTime – задержка между циклами в потоке модуля (см. TKRThread)
- WaitPauseTime – задержка между циклами в потоке модуля в пассивном режиме (см. TKRThread)
- CheckID – включение/выключение идентификации пакетов. Используется только в Mobus TCP
Методы класса TKRModbusMaster
- ErrorMsg – получение сообщение об ошибки по её коду
- AError – код ошибки
- ALevel – исходящая переменная, содержит информацию о обработчике в котором возникла ошибка. Может возвращать следующие значения: «Ошибка прибора», «Ошибка обработки данных», «Ошибка передачи данных»
- ReadReadCoils – отправляет запрос на выполнение функции чтение состояния группы дискретных регистров
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- ReadDiscretInputs – отправляет запрос на выполнение функции чтение состояния группы дискретных входов
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartInput – адрес начального дискретного входа
- ACount – количество дискретных входов
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- ReadHoldingRegisters – отправляет запрос на выполнение функции чтение значения группы регистров
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- ReadInputRegisters – отправляет запрос на выполнение функции чтение значения группы входящих регистров
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- ReadStatus – отправляет запрос на получение статуса удаленного устройства
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- UserFunction – отправляет запрос на выполнение пользовательской функции
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AFunc – номер функции
- AData – указатель на буфер с данными пакета
- ADataLen – длина пакета данных
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- WriteCoil – отправляет запрос на выполнение функции записи состояния дискретного регистра
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- ACoilNum – адрес дискретного регистра
- AData – значение для записи
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- WriteCoils – отправляет запрос на выполнение функции записи состояния группы дискретных регистров
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- AData – значения для записи
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- WriteHoldingRegister – отправляет запрос на выполнение функции записи значения в регистр
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес регистра
- AData – значение для записи
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- WriteHoldingRegisters – отправляет запрос на выполнение функции записи данных в группу регистров
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес начального регистра
- AData – значения для записи
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- SendPack – отправляет ранее сформированный запрос
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AFunc – код функции
- APPack – указатель на буфер с запросом
- APkLen – длина запроса
- ACallBack – обратная функция типа TMBMCallBack, будет вызвана после обработки ответа
- ARecvLen – длина пакета с ответом на этот запрос
- ReadReadCoilsPack – формирование пакета функции чтение состояния группы дискретных регистров. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- ReadDiscretInputsPack – формирование пакета функции чтение состояния группы дискретных входов. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartInput – адрес начального дискретного входа
- ACount – количество дискретных входов
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- ReadHoldingRegistersPack – ормирование пакета функции чтение значения группы регистров. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- ReadInputRegistersPack – формирование пакета функции чтение значения группы входящих регистров. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес начального регистра
- ACount – количество регистров
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- ReadStatusPack – формирование пакета функции статуса удаленного устройства. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- UserFunctionPack – формирование пакета пользовательской функции. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AFunc – номер функции
- AData – указатель на буфер с данными пакета
- ADataLen – длина пакета данных
- APPack – указатель на буфер, в который записывается сформированный пакет
- WriteCoilPack – формирование пакета функции записи состояния дискретного регистра. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- ACoilNum – адрес дискретного регистра
- AData – значение для записи
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- WriteCoilsPack – формирование пакета функции записи состояния группы дискретных регистров. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartCoil – адрес начального дискретного регистра
- ACount – количество дискретных регистров
- AData – значения для записи
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- WriteHoldingRegisterPack – формирование пакета функции записи значения в регистр. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес регистра
- AData – значение для записи
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
- WriteHoldingRegistersPack – формирование пакета функции записи данных в группу регистров. Возвращает длину пакета
- AMBType – значение типа TMBType, указывает на тип Modbus протокола
- AAddres – адрес устройства
- AStartReg – адрес начального регистра
- AData – значения для записи
- APPack – указатель на буфер, в который записывается сформированный пакет
- ARecvLen – длина пакета с ответом на этот запрос
Я начал изучать вопросы написания прогамы опроса устройства по протоколу Modbus TCP, в качестве основных компонентов опроса решил использовать Ваши компоненты.
За основу взял, Ваш пример опроса Овеновского устройства переделав его на TCP/
Устройство с которым, я работаю имеет большое количество регистров, потому решил в таймере, опрашивать сразу целый массив регистров начиная с регистра 100 по 160.
Для этого в таймере я вызываю функцию ReadHoldingRegisters:
Опрос проводится со скоростью 100мс. Все бы ничего, но спустя очень короткое время (от 4сек до нескольких минут) вылетает ошибка access violation at address XXXX in module..
после чего компилятор меня переносит в модуль KRModbusMaster, (строка 2380) на метод
procedure TKRMBThread._CallBack(AError: integer; APack: PKRBuffer;
конкретно сюда:
В чем может быть причина этой ошибки, или что я не доделал так чтобы решить задачу чтения регистров??
Спасибо за внимание!
С уважением Дмитрий!
Procedure TForm1.CallBack(AError: integer; AData: Pointer);
вызывается не из основного потока. По этому нужно соблюсти правила синхронизации потоков. Из параллельного потока нельзя обращаться к визуальным компонентам. В вашем случае скорее всего ошибку вызвала строка
StatusBar1.Panels[1].Text := MB_PARSER_ERRORS_MSG[AError];
Я думаю тут подошла бы синхронизация через сообщения Windows. Плюс, желательно останавливать таймер на время выполнения запроса, так как если вдруг получится так, что время обработки запроса будет больше времени срабатывания таймера, то будет переполняться очередь запросов. Я бы сделал это так:
Надо будет както более глубоко изучить Ваш труд и поучаствовать в написании примеров и справки к Вашим компонентам.
Как я понял из вашего примера идея такая:
1. Вначале, из любого удобного места приложения, по мере надобности передаем запрос на чтение, необходимой группы регистров - командой ReadHoldingRegisters.
2. В пользовательской функции обратного вызова CallBack, мы принимаем и дешифруем данные с группы регистров. При этом действия функции CallBack происходят в пределах другого потока, и для того чтобы сообщить основному приложению о завершении этой работы, мы посылаем ему сообщение WM_MBCALLBACK.
3.В предварительно прописанном методе WMMBCallback, производим обработку полученных данных, например вывод на пользовательский интерфейс.
Т.е. требуется опрос Modbus устройства оформить в трех фазах.
Еще раз благодарю за внимание и оперативные ответы, и прошу прощения за не своевременный ответ.
2. Да, CallBack вызывается из другого потока. С помощью SendMessage мы приостанавливаем этот поток пока окно которому принадлежит Handle не обработает запрос.
3. Да.
Ещё можно сделать так
Код ошибки передаем в заранее созданную переменную. Из callback функции обращаться к визуальным компонентам нельзя, так как она вызывается не из основного потока.
Затем с помощью таймера можно сделать так: