Все три регистра позволяют считывать значение с первого канала.Со связью разобрался. К сожалению причина собственная невнимательность (не создал задачу для программы). Но сейчас пытаюсь разобраться с чтением (на примере первого входа) подаваемого напряжения. В таблице Г.3 руководства указаны три разных адреса регистра для первого канала(1 - 0х100, 2 - 0х108, 3 - 0х120, 0х121, 0х122) для чтения измеренного значения. Какой из них необходимо использовать для получения значения с первого канала? В программе пробовал подставлять все из этих значений - итог, читается только "0". Для наглядности приведу код программы.
Объявленные переменные:
Скрытый текст:Код:VAR COM_Service_Com3: ComService.COM_SERVICE; // ФБ настройки и открытия порта COM3 Settings_COM3: ComService.COM_SETTINGS; // Структура настроек порта COM3 SettingsEX_COM3: ComService.COM_SETTINGSex; // Структура расширенных настроек порта COM3 MV110_8A: ModBus.MB_RD_INPUTS; // ФБ опроса модуля МВ110-8АC MB_RD_HOLD_REGS rMV110_8A_input1: REAL; // Показания входа 1 модуля МВ110-8АC wMV110_8A_input1_status: WORD; // Код ошибки измерения входа 1 wsMV110_8A_input1_status: WSTRING; // Статус измерения входа 1 abyBuffer: ARRAY [0..255] OF BYTE; // Буфер ФБ опроса модуля МВ110-8АC abyMV110_8A_data: ARRAY [0..255] OF BYTE; // Буфер данных, считанных с модуля МВ110-8АC _2WORD_TO_REAL: Word_Real; // Экземпляр объединения для преобразования двух WORD в REAL END_VAR
И собственно сама программа:
Скрытый текст:Код:// [1] настраиваем COM-port Settings_COM3.sPort := 3; Settings_COM3.byStopBits := 1; Settings_COM3.byParity := 0; Settings_COM3.ulBaudrate := 115200; Settings_COM3.ulTimeout := 0; Settings_COM3.ulBufferSize := 0; SettingsEX_COM3.byByteSize := 8; // [2] открываем COM-port COM_Service_Com3 ( Enable := TRUE, Settings := Settings_COM3, Sets_EX := SettingsEX_COM3, Task := ComService.OPEN_TSK ); // [3] запускаем ФБ опроса модуля МВ110-8А MV110_8A ( Enable := COM_Service_Com3.Ready, Mode := ModBus.MB_RTU, DevAddr := 1, FirstAddr := 16#100, Quantity := 1, ComHandle := COM_Service_Com3.Handle, TimeOut := T#45MS, Buffer := abyBuffer, ); // [4] если ФБ опроса модуля завершил работу IF MV110_8A.Complete THEN IF MV110_8A.Exception =0 THEN // байты 0 и 1 содержат статус измерения входа 1 // склеиваем их в WORD и декодируем в текстовое сообщение wMV110_8A_input1_status := BYTE_TO_WORD(abyMV110_8A_data[1]) OR SHL(BYTE_TO_WORD(abyMV110_8A_data[0]), 8); wsMV110_8A_input1_status := Mx110Assistant.MvStatusToWstring(wMV110_8A_input1_status); // байты 4-7 содержат значение на входе 1 с плавающей точкой. // переставляем байты местами и преобразуем в REAL _2WORD_TO_REAL.abyBytes[3] := abyMV110_8A_data[4]; _2WORD_TO_REAL.abyBytes[2] := abyMV110_8A_data[5]; _2WORD_TO_REAL.abyBytes[1] := abyMV110_8A_data[6]; _2WORD_TO_REAL.abyBytes[0] := abyMV110_8A_data[7]; rMV110_8A_input1 := _2WORD_TO_REAL.rReal; END_IF // завершаем опрос модуля МВ110-8А MV110_8A(Enable := FALSE, Buffer := abyBuffer); END_IF
Вы "0" видите где? В буфере какие-нибудь данные получаете?
Не вижу у Вас в коде копирование буфера ФБ в пользовательский буфер, чтобы далее его распарсить.