Пример как самому написать опрос контроллера через СОМ-порт по протоколу ModBus

Обмен с устройством реализуется с помощью скрипта, работающем в отдельном потоке.

Порядок действий для работы с СОМ-портом следующий:

  1. Создайте переменные с типом «константа», в которые будет выводиться данные.
  2. Создайте скрипт. Условие запуска выберите «В отдельном потоке».
  3. Откройте СОМ-порт с помощью функции OpenCOMPort. Функция возвращает хэндл СОМ-порта. h:=OpenCOMPort('COM4',9600,'N',8,1,100); //100 – таймаут ожидания ответа.
  4. Организуйте цикл repeat until Terminated; , где Terminated – означает, что программа завешается и пора выходить. Если цикл не будет организован, скрипт исполнится один раз и закончится.
  5. В цикле сформируйте последовательность байт и отправьте её в порт с помощью функции SendToCOMPort(h,output); // output – это строка (тип string). В строке удобно формировать последовательность байт, например так: output:=Chr(addr)+Chr($03)+Chr($00)+Chr(count);. Функция Chr конвертирует целое число в символ.
  6. Примите данные из порта с помощью функции ReadFromCOMPort. input:= ReadFromCOMPort(h); //Результат принимаем в строковую переменную input.
  7. Проверить длину, контрольную сумму принятых данных, выбрать численное значение из результата, присвоить переменным из п.1 значения (Например, ti_script2_1 :=Ord(input[4])*256+Ord(input[5]);).
  8. В конце скрипта закрыть порт CloseCOMPort(h);
//Пример скрипта, работающего с СОМ-портом
//Опрос 2-х контроллеров по протоколу ModBus
var h,count_arr2: Integer;
var arr:array [1..125] of Integer;
//Опрос одного устройства вынесем в отдельную функцию
function opros_mb4xxx(addr,reg,count: Integer;var count_arr: Integer ):boolean;
var output,input: String;
i,count_input:  Integer;
begin
//Запрос на чтение регистров типа 4ХХХХ
output:=Chr(addr)+Chr($03)+Chr((reg and $FFFF) shr 16)+
Chr( reg and $FFFF)+Chr($00)+Chr(count); output:=output+ CalcModBusCRC(output); //Пристраиваем в конец контрольную
 сумму ModBus SendToCOMPort(h,output);// Отправляем в порт пакет input:= ReadFromCOMPort(h);// Читаем ответ из порта if Length(input)>4 then //Проверяйте на корректность ответа, чтобы не
залезть потом в несуществующий элемент массива!!! if ChechModBusCRC(input) then if ord(input[2])<16 then begin count_input:=ord(input[3]) div 2; //WriteStrToFile( StrToHexFormat( input),'mb.txt');
// Можно вести логи в файл при желании for i:=0 to count_input-1 do arr[i+1]:= Ord(input[4+i*2])*256+Ord(input[5+i*2]);// Пересчет значения result:=true; end else result:=false; end; h:=OpenCOMPort('COM4',9600,'N',8,1,100);//Открываю СОМ-порт repeat //Если цикл не будет организован, скрипт исполнится один раз и закончится. try if opros_mb4xxx(1,0,2,count_arr2) then begin ti_script1_1:=arr[1];//Вывод в переменную ti_script1_1 ti_script1_2:=arr[2];//Вывод в переменную ti_script1_2 end else begin SetBadQualityToValue('ti_script1_1');// Установка плохого качества для переменной,
если ответ неправильный SetBadQualityToValue('ti_script1_2'); end; if opros_mb4xxx(2,0,2,count_arr2) then begin ti_script2_1:=arr[1];//Вывод в переменную ti_script2_1 ti_script2_2:=arr[2]; end else begin SetBadQualityToValue('ti_script2_1');// Установка плохого качества для переменной,
 если ответ неправильный SetBadQualityToValue('ti_script2_2'); end; finally Sleep(20); end; until Terminated;//Terminated – означает, что программа завешается и пора выходить. CloseCOMPort(h); //Закрывам СОМ-порт в конце