PDA

Просмотр полной версии : ПЛК110 и Энергомера СЕ301



savloni
13.12.2019, 11:15
Приветствую.
Нужно прочитать контроллером ПЛК110 значение накопленной энергии из счетчика Энергомера СЕ301.
Может кто-нибудь уже делал подобное?
Спасибо.

melky
13.12.2019, 11:52
Если в примерах нет, то сами. Работа с портом и нестандартными протоколами. Такую тему ещё ищите.

melky
13.12.2019, 11:54
Особо военного там ничего нет, не считая того, что расчет контрольной суммы не по стандарту. Они где то в документации это указали.

savloni
20.05.2020, 15:21
Пытаюсь из ПЛК110 прочитать счетчик Энергомера СЕ301 с помощью быстрого чтения.
Счетчик подключен к RS485-1. Использую SysLibCom.
Пытаюсь выполнить команду /?!<SOH>R1<STX>NAME()<ETX><BCC>

Код:

VAR
step, _step, count: DINT;
rx_buffer, tx_buffer: ARRAY [0..16] OF BYTE;
timeout: TON := (PT := T#2000ms);
BCCW: WORD;
BCCI: WORD;
BCC: WORD;
END_VAR

VAR CONSTANT
port: COMSETTINGS := (Port := 0, dwBaudRate := 9600, byStopBits:=1, byParity:=0);
END_VAR



CASE step OF

0: (* открвываем порт *)
IF SysComOpen(port.Port) = 0 THEN
step := step + 1;
END_IF

1: (* соединяемся *)
IF SysComSetSettings(port.Port, ADR(port)) = 0 THEN
step := step + 1;
END_IF

2: (* формируем строку запроса *)
tx_buffer[0] := 47; (*'/';*)
tx_buffer[1] := 63; (*'?';*)
tx_buffer[2] := 33; (*'!';*)
tx_buffer[3] := 1; (*SOH*)
tx_buffer[4] := 82; (*'R';*)
tx_buffer[5] := 49; (* '1'; *)
tx_buffer[6] := 2; (*STX*)

tx_buffer[7] := 49; (* '1'; *)
tx_buffer[8] := 48; (* '0'; *)
tx_buffer[9] := 48; (* '0'; *)
tx_buffer[10] := 49; (* '1'; *)
tx_buffer[11] := 40; (* '('; *)
tx_buffer[12] := 48; (* '0'; *)
tx_buffer[13] := 49; (* '1'; *)
tx_buffer[14] := 41; (* ')';*)

tx_buffer[15] := 3; (*ETX*)

(*считаем BCC*)
BCCW := 0;
FOR BCCI := 4 TO 15 BY 1 DO
BCCW := BCCW + tx_buffer[BCCI];
END_FOR;
BCC := BCCW MOD 128;
BCC.7 := 0;

tx_buffer[16] :=WORD_TO_BYTE(BCC);

count := 0;
step := step + 1;

3: (* отправляем запрос *)
count := count + SysComWrite(port.Port, ADR(tx_buffer) + count, 17 - count, 0);
IF count >= 17 THEN
count := 0;
step := step + 1;
END_IF

4: (*читаем ответ *)
count := count + SysComRead(port.Port, ADR(rx_buffer) + count, 17 - count, 0);
IF count >= 17 THEN
;
END_IF

END_CASE

При этом при первом включении счетчика и запуске программы выполняются шаги 0,1,2,3, а в 4-м ничего не читается count всегда = 0. Если остановить программу и запустить заново, не выключая счетчик, то зависает на шаге 0 (открытии порта).
В чем может быть проблема?

melky
20.05.2020, 15:57
Логер на порт ставили ? У них есть нюансик, параметр порта должен быть 7E1 и он немножечко у них программный
И у вас счетчик на линии единственный ?

Мне немного сложновато понимать ST, но вы нифига не прочтете этим кодом...


Отправка (5): /?!<0D><0A> // безадресный запрос
Приём (16): /EKT5CE102Mv01<0D><0A> // ответ счетчика

Отправка (6): <06>051<0D><0A> // запрос на чтение Режим С протокола МЭК61107
Приём (17): <01>P0<02>(145605366)<03>* // Ответ, что счетчик готов

Отправка (14): <01>P1<02>(777777)<03>! // Отправка пароля счетчика по умолчанию
Приём (1): <06> // подтверждающий ответ

Отправка (13): <01>R1<02>VOLTA()<03>_ // запросы параметров
Приём (18): <02>VOLTA(217.72)<0D><0A><03>"

Отправка (13): <01>R1<02>CURRE()<03>Z
Приём (17): <02>CURRE(0.042)<0D><0A><03>`

Отправка (13): <01>R1<02>POWEP()<03>d
Приём (20): <02>POWEP(0.006305)<0D><0A><03><02>

Отправка (13): <01>R1<02>COS_f()<03><03>
Приём (17): <02>COS_f(0.769)<0D><0A><03><19>

Отправка (13): <01>R1<02>FREQU()<03>\
Приём (17): <02>FREQU(50.00)<0D><0A><03>a

Отправка (13): <01>R1<02>ET0PE()<03>7
Приём (57): <02>ET0PE(11.65)<0D><0A>(7.88)<0D><0A>(3.77)<0D><0A>(0.00)<0D><0A>(0.00)<0D><0A>(0.00)<0D><0A><03>*

Отправка (13): <01>R1<02>WATCH()<03>P
Приём (34): <02>WATCH(16:00:04,03.20.05.20,0)<0D><0A><03><1F>

Отправка (13): <01>R1<02>STAT_()<03>t
Приём (20): <02>STAT_(03000001)<0D><0A><03><0A>

Отправка (5): <01>B0<03>u // закрытие сеанса, иногда он требуется еще если прибор выдает ошибку.

Вот пример запросов и ответов на однофазнике (на 3-х фазном будут просто ответы с большим количеством переменных)
Да, если пароль введете неправильно, счетчик заткнется на какое-то время и будет выдавать ошибку...

И еще, не все подряд требует наличие BCC, читайте протокол.

melky
21.05.2020, 00:29
Хм, почитал про быстрое чтение...
1. Необходимо убедиться, что параметр доступен для чтения пользователю беспарольным методом. (какая то настройка в счетчике)
2. /?!<SOH>R1<STX>NAME()<ETX><BCC> - тут ввести не 1001(01) как вы вводите, а VOLTA() - ответит что нибудь ?


Администратор может читать и программировать все параметры счетчика. Пользователю
доступны для чтения и программирования либо все параметры, либо параметры в соответствии со
списком соответственно чтения (LISTR) и программирования (LISTW). Причем выборочное чтение для пользователя может быть парольным или беспарольным. Режим работы пользователя
(CONDI) и списки параметров задаются администратором или самим пользователем, если ему это
разрешено администратором.

из какого-то документа по CE303


список имен – список имен запрашиваемых параметров в формате группового чтения, не
соответствующем стандарту ГОСТ Р МЭК 61107-2001.
Список имен в групповом запросе передается без разделителей с дополнительными аргументами в скобках или пустыми скобками. Имя параметра состоит из 4-х символов цифр, представленных в 16-ричном формате. У однотипных параметров первые два символа определяют тип
параметра, последние 2 символа – уточнение однотипного параметра. Аргументы, при необходимости, уточняют тип, дату, номер, количество запрашиваемых параметров.
Например: 0001()0020(0B010B)…200A(0B010B,3,2).

Как говорится там же, групповое чтение не соответствует протоколу... а очень жаль...

pixiemosty
05.05.2021, 17:34
Подскажите, у вас получилось что нибудь реализовать?

melky
10.05.2021, 12:57
pixiemosty это наверное больше вопрос к автору топика. Овен реализует опрос данных счетчиков но для CDS 3.5