Приветствую.
Нужно прочитать контроллером ПЛК110 значение накопленной энергии из счетчика Энергомера СЕ301.
Может кто-нибудь уже делал подобное?
Спасибо.
Приветствую.
Нужно прочитать контроллером ПЛК110 значение накопленной энергии из счетчика Энергомера СЕ301.
Может кто-нибудь уже делал подобное?
Спасибо.
Если в примерах нет, то сами. Работа с портом и нестандартными протоколами. Такую тему ещё ищите.
Особо военного там ничего нет, не считая того, что расчет контрольной суммы не по стандарту. Они где то в документации это указали.
Пытаюсь из ПЛК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 (открытии порта).
В чем может быть проблема?
Логер на порт ставили ? У них есть нюансик, параметр порта должен быть 7E1 и он немножечко у них программный
И у вас счетчик на линии единственный ?
Мне немного сложновато понимать ST, но вы нифига не прочтете этим кодом...
Вот пример запросов и ответов на однофазнике (на 3-х фазном будут просто ответы с большим количеством переменных)Код:Отправка (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 // закрытие сеанса, иногда он требуется еще если прибор выдает ошибку.
Да, если пароль введете неправильно, счетчик заткнется на какое-то время и будет выдавать ошибку...
И еще, не все подряд требует наличие BCC, читайте протокол.
Последний раз редактировалось melky; 20.05.2020 в 16:13.
Хм, почитал про быстрое чтение...
1. Необходимо убедиться, что параметр доступен для чтения пользователю беспарольным методом. (какая то настройка в счетчике)
2. /?!<SOH>R1<STX>NAME()<ETX><BCC> - тут ввести не 1001(01) как вы вводите, а VOLTA() - ответит что нибудь ?
из какого-то документа по CE303Администратор может читать и программировать все параметры счетчика. Пользователю
доступны для чтения и программирования либо все параметры, либо параметры в соответствии со
списком соответственно чтения (LISTR) и программирования (LISTW). Причем выборочное чтение для пользователя может быть парольным или беспарольным. Режим работы пользователя
(CONDI) и списки параметров задаются администратором или самим пользователем, если ему это
разрешено администратором.
Как говорится там же, групповое чтение не соответствует протоколу... а очень жаль...список имен – список имен запрашиваемых параметров в формате группового чтения, не
соответствующем стандарту ГОСТ Р МЭК 61107-2001.
Список имен в групповом запросе передается без разделителей с дополнительными аргументами в скобках или пустыми скобками. Имя параметра состоит из 4-х символов цифр, представленных в 16-ричном формате. У однотипных параметров первые два символа определяют тип
параметра, последние 2 символа – уточнение однотипного параметра. Аргументы, при необходимости, уточняют тип, дату, номер, количество запрашиваемых параметров.
Например: 0001()0020(0B010B)…200A(0B010B,3,2).
Последний раз редактировалось melky; 21.05.2020 в 00:34.
Подскажите, у вас получилось что нибудь реализовать?
pixiemosty это наверное больше вопрос к автору топика. Овен реализует опрос данных счетчиков но для CDS 3.5