Выложите ваш проект, пожалуйста.
Все таки тут вообще не получается до счетчика достучаться этим запросом.
На СПК подключен счетчик к COM1, пробовал и 1 и 2 задавать программно. 0 реакции.
А что висит пустая строка на COM_READ размером 256, то она и без счетчика висит :(
Вложение 55125
pixiemosty кнопочку на счетчике нажали для разрешения передачи? :) есть там у него фокус с каким-то параметром, который управляется кнопкой либо разрешает передачу либо запрещает.
Я извиняюсь, заработался тут)
Получилось получить ответ от счетчика!
Два момента осталось:
1. Расчет контрольной суммы, который реализуется немного другим способом, как я понимаю.
2. Во время опроса счетчика, на нем висит ошибка Error 05.
Вложение 55127
п.с. нажимаю кнопку разрешения эту, она как то не влияет на опрос его, все равно опрос идет)
Вот ссылка на проект, если что: https://disk.yandex.ru/d/wc2VmdPabExuHA
pixiemosty ну мне проект не поможет, некуда загружать. По CRC писал, могу дать код на C#, переделать в ST думаю не особая проблема погуглив.
Вот код расчета CRC для Энергомеры на C#
Код:public static string CalcCS(string s)
{
byte[] bytes = Encoding.Default.GetBytes(s);
byte num = 0;
for (int i = 1; i < (int)bytes.Length; i++)
{
num = (byte)(num + bytes[i]);
}
bytes[0] = (byte)(num & 127);
return Encoding.Default.GetString(bytes, 0, 1);
}
pixiemosty а почему вы решили, что у счетчика адрес 01 ? у них адрес часть серийного номера по умолчанию. Почитайте документацию на счетчик
Весь день промучился с попыткой отправить запрос на счетчик.
Никакой запрос не хочет отвечать, кроме самого первого /?! CR LF.
Пытаюсь следующим отправить ACK 0 5 (0 и 1) CR LF, но ответа нет.
Что я делаю не так? Почему на следующий запрос нет ответа?
Если есть возможность посмотреть проект, гляньте пожалуйста.
https://disk.yandex.ru/d/Ckbw_W07ZJhkxg
Вложение 55163
Вложение 55164
Пробую реализовать опрос по этому логу, попутно читая мэк 61107.
Отправка (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> // подтверждающий ответ
п.с. Избавился от ошибки Err5 при запросе.
п.с.с. на счёт адресного запроса, по документации адрес это последние 4 цифры серийника, пытаюсь достучаться до счетчика с адресом /?1829! CR LF, где 1829 последние 4 цифры, пока безрезультатно
Получилось, все таки адрес там не 4х значный.
Ну да, там где-то 8 цифр в адресе :) если не весь серийник, не помню уже.
Да, не весь. Около 8-9.
Нашли наконец преобразователь 485 в юсб, через софтину Энергомеры посмотрел логи запросов, стало легче)
Реализовал вчера:
1. Адресный запрос
2. Запрос на программирование
3. Вход с паролем
На все эти запросы счётчик отвечает, вот осталось реализовать именно считывание параметров, но с логами сейчас будет легче осуществлять.
Ну и контрольную сумму переделать, которую вы отправляли)
Действующее напряжение, ток, частота, потребление электроэнергии за месяц ну и еще может пользовательский период времени.
Не хочет выдавать запрос по напряжению. Запрос такой же, как в логе.
На счетчике висит нагрузка, хм.
В чем дело интересно.
Вложение 55193
После того как залогинились к счетчику уже проще, просто посылаете запрос того же напряжения VOLTA() и получаете ответ.
я использовал работу со строками и ) использовал как сепаратор для остановки и поиска индекса от (
Для трехфазника таких будет несколько переменных VOLTA(223.795)VOLTA(0.277)VOLTA(0.097)
Ну и так далее
Как нет ответа? у вас же пришло VOLTA(220.48)
Контрольная сумма есть?, правильная ? Это уже запрос с контрольной суммой вроде
Я делаю запрос с контрольной суммойВложение 55197
Вам надо LEN делать, а не SIZEOF.
Тут у меня LEN)
Но я считал данные напряжения, считаю это успехом!:))
Вложение 55198
Вложение 55199
Вложение 55200
Единственное, почему-то счётчик не хочет отвечать на другой запрос после предыдущего.
Например делаю запрос:
VOLTA () - ответ
CURRE() - нет ответа.
Если делаю по отдельности, то все нормально.
Менял и время ожидания, все равно.
Надо разбираться почему не хочет так.
Станьте снифером порта с ПК между счетчиком и ПЛК, возможно мусор на следующем шаге идет. Буфер не очищается или еще что-то, а то так гадать можно долго
Так, вас понял, только в двух словах с помощью чего это реализовать, подскажите?
Но все же первые 4 шага реализуются без косяков, всегда ответ есть от счетчика.
1: / ? АДРЕС! CR LF Ответ есть
2: ACK 0 5 1 CR LF Ответ есть
3: <SOH>P1<STX>(777777)<ETX><BCC> Ответ есть
4: <SOH>R1<STX>VOLTA()<ETX><BCC> Ответ есть
5: <SOH>R1<STX>CURRE()<ETX><BCC> Тут ответа нет.
Блоки по факту одинаковые, меняется только запрос.
На 5-м шаге BCC корректно считается?
ADVANCED SERIAL DATA LOGGER - trial версии вполне достаточно, можно настроить порт на прослушку, правда не помню, может ли он со стороны смотреть, но вроде должен.
Надо посмотреть что на пятом шаге реально уходит в порт.
pixiemosty вы контрольную сумму считаете программно или просто подставляете ?
Считаю программно.
Сейчас уже не смогу запустить, ушел из кабинета.
Но вот на скриншоте приложил. Считает BCC корректно
pixiemosty насколько помню, в BCC старший бит тоже сбрасывается, если он появляется. Но если вы вместо VOLTA делаете запрос CURRE и работает, думаю причина какая-то с буфером
Да, если делаю отдельно CURRE, все работает. Также делаю и по месяцам потребление, тоже все работает.
А вот если пытаюсь опросить вместе, то все, ответа нет.
Завтра попробую поразбираться в чем причина, вроде буфер чищу функцией BUFFER CLEAR. Хммм.
Получилось реализовать считывание параметры сети и потребление за месяц\день\общее в реальном времени отдельными запросами, считаю это успехом! Всем спасибо большое за помощь!)
Вложение 55261
pixiemosty и в чем была причина зависания ?
Я наверно уже все методы перепробовал.
Я сделал несколько действий:
1) Сделал опрос цикличным со сбросом всех флагов запросов (xEnable := FALSE) в начале следующего запроса. Получается так, прошел запрос, начинается следующий, предыдущий сбрасывается и тд. Думаю это все и запустило.
2) Сделал такие задержки в таймере.
VAR CONSTANT
c_tTimeout: TIME:=T#1S; // таймаут опроса модуля (время ожидания ответа)
c_tDelay: TIME:=T#10MS; // задержка перед отправкой следующего запроса
END_VAR
может задержка между запросами повлияла. Будет время, прикручу счетчик к Scada и попробую между запросами 0 поставить, посмотрю что произойдет.
Я тоже поиграю со временем, хочу к минимально допустимому придти.
Наконец осталось реализовать проверку контрольной суммы.
Но вот какое дело, у считываемого ответа с счетчика нет в конце контрольной суммы.
Почему в конце ее нет, хмм..
pixiemosty как нет? после $03 стоит же ' а $03 это ETX
А блин, это у ас так строка выделяется...
может буфер увеличить ?
Но такой же ответ в буфер влазит, значит не из за этого же
Вложение 55376
pixiemosty но и в этом ответе нет контрольной суммы, хотя должна же быть