Вход

Просмотр полной версии : Опрос Регистратора РМТ39 ("Elemer)



Андрей_ТМЗ
05.10.2023, 14:04
Здравствуйте. Кто может помочь с реализацией опроса регистратора РМТ39DM производства Элемер с контроллера ОВЕН ПЛК210-01? Необходимо вывести данные в СКАДу. Вариант с установкой OPC-сервера на комп уже отработал. Но хочется обойтись без дополнительного оборудования и прокладки кабелей.

Евгений Кислов
05.10.2023, 14:14
Здравствуйте. Кто может помочь с реализацией опроса регистратора РМТ39DM производства Элемер с контроллера ОВЕН ПЛК210-01? Необходимо вывести данные в СКАДу. Вариант с установкой OPC-сервера на комп уже отработал. Но хочется обойтись без дополнительного оборудования и прокладки кабелей.

Добрый день.
Чтобы реализовать опрос - нужно запросить у Элемер протокол обмена данного прибора.

EFrol
05.10.2023, 15:23
Опрашиваю по протоколу RMTA.

Евгений Кислов
05.10.2023, 15:52
Раз описание протокола есть (и он довольно простой) - то можно воспользоваться этим документом и реализовать его по аналогии с приведенным там примером DCON:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_UserProtocols_v.3.0.pdf

Андрей_ТМЗ
06.10.2023, 05:35
Спасибо за подсказки. Не знал с чего начать. Буду пробовать писать протокол. По результату отпишусь.

Андрей_ТМЗ
13.11.2023, 06:25
Здравствуйте. Благодаря EFrol и Евгению Кислову удалось написать протокол обмена регистратора РМТ39DM фирмы Элемер с ПЛК ОВЕН. Точнее удалось отправить корректный запрос, получить ответ и вытащить из него значение температуры в формате REAL. Но возник следующий вопрос: прибор 6-ти канальный, запрос сразу шести каналов у меня не получился. В связи с этим через оператор CASE были составлены запросы для всех шести каналов (Листинг прилагается). Каналы опрашиваются и значения записываются в массив, НО при опросе на половину секунды значение в канале меняется на значение из предыдущего канала. Не могу понять почему. Если необходимо видео, то чуть позже приложу. Также прилагаю полный архив проекта (может кому-то ещё понадобится).

PROGRAM DCON_PRG_OCL
VAR
// ФБ открытия COM-порта
fbComControl: OCL.COM_Control;
// ФБ для опроса устройств по протоколу DCON
fbDconMaster: DCON_MASTER_OCL;
// номер опрашиваемого канала для запроса Elemer_RMT39DM_READ_CHANNEL
uiAiChannelNumber: UINT;
// значение канала
rAiChannelValue: REAL;
// массив значений всех каналов модуля
arAiChannelsValues: ARRAY [1..6] OF REAL;
// ответ на запрос USER_DEFINED (без какой-либо обработки)
sUserDefinedResponse: STRING;
// таймер задержки между запросами
fbPollDelay: TON;
// текущий обрабатываемый запрос
eDconParam: DCON_PARAMS := DCON_PARAMS.Elemer_RMT39DM_READ_CHANNEL_1;

wAiChannelsValues: ARRAY [0..11] OF WORD;
fbAiChannelsValues1 : ocl.real_to_word2;
fbAiChannelsValues2 : ocl.real_to_word2;
fbAiChannelsValues3 : ocl.real_to_word2;
fbAiChannelsValues4 : ocl.real_to_word2;
fbAiChannelsValues5 : ocl.real_to_word2;
fbAiChannelsValues6 : ocl.real_to_word2;

END_VAR

VAR CONSTANT
// задержка между запросами
c_tPollDelay: TIME := T#1S;
END_VAR


================================================== =======================

// открытие COM-порта
fbComControl
(
xEnable := TRUE,
udiComPort := 2,
udiBaudrate := 9600,
udiByteSize := 8,
eParity := OCL.COM_PARITY.NONE,
eStopBit := OCL.COM_STOPBIT.ONE
);

// код опроса
IF fbComControl.xActive THEN

CASE eDconParam OF

// опрос конкретного канала по его номеру
DCON_PARAMS.Elemer_RMT39DM_READ_CHANNEL_1:
uiAiChannelNumber := 1;
fbDconMaster
(
xExecute := TRUE,
tTimeout := T#400MS,
hCom := fbComControl.hCom,
eParam := eDconParam,
usiDeviceAddr := 8,
// номер канала
pRequestData := ADR(uiAiChannelNumber),
szRequestData := SIZEOF(uiAiChannelNumber),
//
pResponseData := ADR(rAiChannelValue),
szResponseData := SIZEOF(rAiChannelValue),
uiChannelNumber := uiAiChannelNumber
);
arAiChannelsValues[uiAiChannelNumber] := rAiChannelValue;
// задержка, сброс блока и переход к следующему запросу
prvDelayAndSwitchToNextRequest(dcon_params.Elemer_ RMT39DM_READ_CHANNEL_2);

DCON_PARAMS.Elemer_RMT39DM_READ_CHANNEL_2:
uiAiChannelNumber := 2;
fbDconMaster
(
xExecute := TRUE,
tTimeout := T#400MS,
hCom := fbComControl.hCom,
eParam := eDconParam,
usiDeviceAddr := 8,
// номер канала
pRequestData := ADR(uiAiChannelNumber),
szRequestData := SIZEOF(uiAiChannelNumber),
//
pResponseData := ADR(rAiChannelValue),
szResponseData := SIZEOF(rAiChannelValue)
);
arAiChannelsValues[uiAiChannelNumber] := rAiChannelValue;
// задержка, сброс блока и переход к следующему запросу
prvDelayAndSwitchToNextRequest(dcon_params.Elemer_ RMT39DM_READ_CHANNEL_3);

DCON_PARAMS.Elemer_RMT39DM_READ_CHANNEL_3:
uiAiChannelNumber := 3;
fbDconMaster
(
xExecute := TRUE,
tTimeout := T#400MS,
hCom := fbComControl.hCom,
eParam := eDconParam,
usiDeviceAddr := 8,
// номер канала
pRequestData := ADR(uiAiChannelNumber),
szRequestData := SIZEOF(uiAiChannelNumber),
//
pResponseData := ADR(rAiChannelValue),
szResponseData := SIZEOF(rAiChannelValue)
);
arAiChannelsValues[uiAiChannelNumber] := rAiChannelValue;
// задержка, сброс блока и переход к первому запросу
prvDelayAndSwitchToNextRequest(dcon_params.Elemer_ RMT39DM_READ_CHANNEL_4);

DCON_PARAMS.Elemer_RMT39DM_READ_CHANNEL_4:
uiAiChannelNumber := 4;
fbDconMaster
(
xExecute := TRUE,
tTimeout := T#400MS,
hCom := fbComControl.hCom,
eParam := eDconParam,
usiDeviceAddr := 8,
// номер канала
pRequestData := ADR(uiAiChannelNumber),
szRequestData := SIZEOF(uiAiChannelNumber),
//
pResponseData := ADR(rAiChannelValue),
szResponseData := SIZEOF(rAiChannelValue)
);
arAiChannelsValues[uiAiChannelNumber] := rAiChannelValue;
// задержка, сброс блока и переход к первому запросу
prvDelayAndSwitchToNextRequest(dcon_params.Elemer_ RMT39DM_READ_CHANNEL_5);

DCON_PARAMS.Elemer_RMT39DM_READ_CHANNEL_5:
uiAiChannelNumber := 5;
fbDconMaster
(
xExecute := TRUE,
tTimeout := T#400MS,
hCom := fbComControl.hCom,
eParam := eDconParam,
usiDeviceAddr := 8,
// номер канала
pRequestData := ADR(uiAiChannelNumber),
szRequestData := SIZEOF(uiAiChannelNumber),
//
pResponseData := ADR(rAiChannelValue),
szResponseData := SIZEOF(rAiChannelValue)
);
arAiChannelsValues[uiAiChannelNumber] := rAiChannelValue;
// задержка, сброс блока и переход к первому запросу
prvDelayAndSwitchToNextRequest(dcon_params.Elemer_ RMT39DM_READ_CHANNEL_6);

DCON_PARAMS.Elemer_RMT39DM_READ_CHANNEL_6:
uiAiChannelNumber := 6;
fbDconMaster
(
xExecute := TRUE,
tTimeout := T#400MS,
hCom := fbComControl.hCom,
eParam := eDconParam,
usiDeviceAddr := 8,
// номер канала
pRequestData := ADR(uiAiChannelNumber),
szRequestData := SIZEOF(uiAiChannelNumber),
//
pResponseData := ADR(rAiChannelValue),
szResponseData := SIZEOF(rAiChannelValue)
);
arAiChannelsValues[uiAiChannelNumber] := rAiChannelValue;
// задержка, сброс блока и переход к первому запросу
prvDelayAndSwitchToNextRequest(dcon_params.Elemer_ RMT39DM_READ_CHANNEL_1);
END_CASE
fbAiChannelsValues1(rInput := arAiChannelsValues[1], xSwapBytes := FALSE, wOutput1 => wAiChannelsValues[0], wOutput2 => wAiChannelsValues[1]);
fbAiChannelsValues2(rInput := arAiChannelsValues[2], xSwapBytes := FALSE, wOutput1 => wAiChannelsValues[2], wOutput2 => wAiChannelsValues[3]);
fbAiChannelsValues3(rInput := arAiChannelsValues[3], xSwapBytes := FALSE, wOutput1 => wAiChannelsValues[4], wOutput2 => wAiChannelsValues[5]);
fbAiChannelsValues4(rInput := arAiChannelsValues[4], xSwapBytes := FALSE, wOutput1 => wAiChannelsValues[6], wOutput2 => wAiChannelsValues[7]);
fbAiChannelsValues5(rInput := arAiChannelsValues[5], xSwapBytes := FALSE, wOutput1 => wAiChannelsValues[8], wOutput2 => wAiChannelsValues[9]);
fbAiChannelsValues6(rInput := arAiChannelsValues[6], xSwapBytes := FALSE, wOutput1 => wAiChannelsValues[10], wOutput2 => wAiChannelsValues[11]);
END_IF

EFrol
13.11.2023, 08:25
К сожалению, это глюк самого РМТ. У меня были моменты, когда каналы менялись местами. Помогал только сброс питания. Поэтому заменили на безбумажный РМТ19.

Андрей_ТМЗ
13.11.2023, 08:33
К сожалению, это глюк самого РМТ. У меня были моменты, когда каналы менялись местами. Помогал только сброс питания. Поэтому заменили на безбумажный РМТ19.

Спасибо. Но заменить пока не вариант. Может подскажете как этот эффект сгладить? При опросе контроллера через ОРС этот эффект происходит ещё реже.

EFrol
13.11.2023, 09:28
Полностью сгладить не получилось. Увеличил период между опросами на максимально возможную для процесса величину - эффект все равно проявлялся раз в месяц (даже через родной OPC).

Андрей_ТМЗ
13.11.2023, 10:18
Спасибо. Будем как-то с этим жить.

Андрей_ТМЗ
06.12.2023, 14:01
Снова здравствуйте. Возвращаясь к теме опроса РМТ39 прошу помощи в следующем. Как писал выше протокол написал, запустил на виртуальном ПЛК и успешно опросил прибор. Теперь данный протокол необходимо внедрить в основную исполняемую программу на ПЛК210-01. В связи с этим поменял таргет-файл с виртуального ПЛК на ПЛК210-01. Все блоки, программы и методы скопировал в основной проект. Также изменил номер СОМ-порта на соответствующий порту RS485-1 (номер 5). Загружаю проект в контроллер... и ничего. Никаких принятых данных, только нули. Порт открыт, запросы сформированы. Не приходит ответ и блок UnmSerialReques выдает ошибку TimeOut. Линию проверили - рабочая (подключились по этой линии через конвертер и виртуальный контроллер). Для проверки загрузил программу, в которой только опрос приборов РМТ в физический контроллер (благо технологический процесс позволяет ненадолго манипулировать контроллером), и о чудо - данные появились. В связи с этим вопрос: Что не так с программой где кроме протокола DCON опрашивается куча модулей Мх210, ТРМов и передаются данные в СКАДу? Время таймаута увеличивал результата нет. Прошу помочь, т.к уже неделю ломаю голову.

Евгений Кислов
06.12.2023, 15:59
Снова здравствуйте. Возвращаясь к теме опроса РМТ39 прошу помощи в следующем. Как писал выше протокол написал, запустил на виртуальном ПЛК и успешно опросил прибор. Теперь данный протокол необходимо внедрить в основную исполняемую программу на ПЛК210-01. В связи с этим поменял таргет-файл с виртуального ПЛК на ПЛК210-01. Все блоки, программы и методы скопировал в основной проект. Также изменил номер СОМ-порта на соответствующий порту RS485-1 (номер 5). Загружаю проект в контроллер... и ничего. Никаких принятых данных, только нули. Порт открыт, запросы сформированы. Не приходит ответ и блок UnmSerialReques выдает ошибку TimeOut. Линию проверили - рабочая (подключились по этой линии через конвертер и виртуальный контроллер). Для проверки загрузил программу, в которой только опрос приборов РМТ в физический контроллер (благо технологический процесс позволяет ненадолго манипулировать контроллером), и о чудо - данные появились. В связи с этим вопрос: Что не так с программой где кроме протокола DCON опрашивается куча модулей Мх210, ТРМов и передаются данные в СКАДу? Время таймаута увеличивал результата нет. Прошу помочь, т.к уже неделю ломаю голову.

Добрый день. Свяжитесь, пожалуйста, со мной (контакты в подписи).
Нужно будет договориться и организовать удаленное подключение (AeroAdmin или AnyDesk) в тот момент, когда "технологический процесс позволит ненадолго манипулировать контроллером" для исследования вашей ситуации.