PDA

Просмотр полной версии : ПЛК + Логика СПГ761



приборист
05.06.2014, 13:13
Добрый день!
В общем начал разбираться с получением данных из Логики.
И начинаю потихоньку натыкаться на вопросы:

Есть сама Логика СПГ761
Есть контроллер ПЛК110-32

Попытавшись использовать бибку от СПГ741 - результатов не возымело.

Поэтому подключив Логику к ком порту компа - начал искать варианты решения проблемы.

Есть документ (во вложении)
Который описывает взаимодействие с похожим прибором, НО отправляя посылку в прибор - ответа мы не получаем.

Пришел к следующему - подключив к компьютеру СПГ, я могу программой запрашивать данные, программа идет вместе с прибором.
Взял сниффер ком порта и попробовал посмотреть какие же запросы отсылает программа в прибор. (Скрин СПГ_1)

Взял прогу, которая умеет отправлять данные в ком порт.
И при соединении с ком портом она выдает следующую инфу (Скрин СПГ_2)
При попытке в прямую отправить строку, что отправляет программа <dle><soh><dle><us><gs><dle><stx><ht><ht><ff><dle><etx><dle><soh><dle><us><gs><dle><stx><ht><ht><ff><dle><etx>- результата нет.

Я так понимаю, вопрос в настройках при обмене. ПРограмма производителя производит одни настройки порта, а моя программа - другие.
Вопрос вот в чем - каким образом настраивается само соединение?
Сниффер выдает только результат команды (СОМ закрыт, СОМ открыт и т.д.)
Но можно же и поменять эти настройки?
Хотелось бы узнать как :)

Гугл активно используется, но пока не могу докопаться до истины.</etx></dle></ff></ht></ht></stx></dle></gs></us></dle></soh></dle></etx></dle></ff></ht></ht></stx></dle></gs></us></dle></soh></dle>

приборист
05.06.2014, 13:38
Попробовал опросить прибор программой Пролог - опрашивается.

И самое интересное - у него есть момент - опрос прибора 94х\74х и там он формирует запрос с 16 FF и последовательностью 10 FF 3F 00 00 00 00 C1 16, как и написано в документации (на теплосчетчик 943)

А потом начинает опрашивать 96х\76х и запрос уже другой 10 01 10 1F 1D 10 02 09 30 09 30 30 33 0C 10 03 C5 15

Видимо протокол поменяли...

Написал письмо в Логику, может пришлют. Хотя сомневаюсь :)

Хм.
Научился получать ответ на запрос, правда в одной программе надо запрашивать так:
$10$01$10$1F$1D$10$02$09$30$09$30$30$33$0C$10$03$C 5$15
А в другой так:
#10#01#10#1F#1D#10#02#09#30#09#30#30#33#0C#10#03#C 5#15

Newcomer
05.06.2014, 14:15
Протокол опроса простой и хорошо описан. Если есть железо для экспериментов, то проблем быть не должно. Только что-то непонятно - прибор Логика СПГ761, а протокол для Тепловычислителя СПТ943.

приборист
05.06.2014, 14:20
Протокол опроса простой и хорошо описан. Если есть железо для экпериментов, то проблем быть не должно.

Проблема в том, что он не актуален.
В том то и дело :(

Этот протокол для старых версий приборов (СПГ741 и СПТ943).

А для новых - описания нет.

приборист
10.06.2014, 14:37
Итак, посылая запрос в прибор - я получаю ответ.
Правда получаю в десятичном формате, а потом необходимо переделывать в ASCII, но это не проблема.

Наткнулся на проблему подсчета CRC.
Заявлено что CRC считается вот так:
http://www.owen.ru/forum/attachment.php?attachmentid=13239&stc=1&d=1402400113

Я нашел аналогичный код на ST, вот такой:


Функция crc16 по полиному 0x1021 в CoDeSys на ST:

-------------------------------
FUNCTION crc16_1021 : WORD

VAR_INPUT
pcBlock: POINTER TO BYTE;
len: WORD;
END_VAR

VAR
crc, i, w: WORD;
END_VAR
-------------------------------
crc := 16#FFFF;
WHILE (LEN > 0) DO
w := pcBlock^;
pcBlock := pcBlock + 1;
w := SHL(w,8);
crc := crc XOR w;
FOR i := 0 TO 7 DO
IF ((crc AND 16#8000) <> 0) THEN
crc := SHL(crc,1) XOR 16#1021;
ELSE
crc := SHL(crc,1);
END_IF
END_FOR
LEN := LEN - 1;
END_WHILE
crc16_1021 := crc;
RETURN;

Но, толи лыжи не едут, толи ;)...
В общем неправильно он считает сумму.

Вопрос к знатокам - действительно ли код на СТ выполняет именно то, что на скрине? Си не знаю, к сожалению :(

melky
10.06.2014, 14:44
а crc_gen из oscat что говорит ?
необходим еще для работы REFLECT и REVERSE из этой же библиотеки.

Правда работает только от 4 байт...

приборист
10.06.2014, 15:07
а crc_gen из oscat что говорит ?
необходим еще для работы REFLECT и REVERSE из этой же библиотеки.

Правда работает только от 4 байт...

Если параметры задаю такие:
CRC-16/CCITT-FALSE 16 1021 FFFF F F 0
То считает так же, как и функция выше.

melky
10.06.2014, 15:22
функция возвращает полный CRC, его на байты еще разделить нужно... не забыли.

приборист
10.06.2014, 15:58
функция возвращает полный CRC, его на байты еще разделить нужно... не забыли.

Я его загоняю в калькулятор, перевожу из Dec в Hex и вижу 2 байта.
Переделал с разбором в массив из 2 байтов - то же самое.

Наверное я косячу где-то в байтах, которые в подсчет CRC идут.

melky
10.06.2014, 16:09
А вы только данные расчитываете ?, там еще речь и про стаффинг символы.

приборист
10.06.2014, 16:13
А вы только данные расчитываете ?, там еще речь и про стаффинг символы.

Все рассчитываю после символа SOH.
В общем сейчас делаю так - запускаю программу к прибору, и слушаю порт (сниффером).
В итоге программа отправляет в прибор следующее:
http://www.owen.ru/forum/attachment.php?attachmentid=13240&stc=1&d=1402406073
Соответственно после SOH И до ETX последнего - считаю CRC.

На скрине Hi или 80 30 и есть CRC1 и CRC2.

Есть еще вот такой вариант запроса (из другой программы)
http://www.owen.ru/forum/attachment.php?attachmentid=13241&stc=1&d=1402407069

Все тоже самое, но количество нулей сокращено.

Нашел калькулятор
http://www.zorc.breitbandkatze.de/crc.html

И все равно не выходит...:confused:

melky
10.06.2014, 17:14
Упс, СПГ761 использует магистральный протокол обмена, есть документация по нему на сайте http://www.logika.spb.ru/spnet_last/spbus.pdf

Может вы не туда копаете, 943 несколько иной

приборист
10.06.2014, 17:17
Упс, СПГ761 использует магистральный протокол обмена, есть документация по нему на сайте http://www.logika.spb.ru/spnet_last/spbus.pdf

Может вы не туда копаете, 943 несколько иной

Я как раз из этого руководства и беру все данные.
Поменял документацию в первом посте.

melky
10.06.2014, 17:45
то, что показывает ваш снифер как-то не совсем вяжется с запросами документации... или я ошибаюсь...

приборист
10.06.2014, 18:06
Нарисовал табличку:
http://www.owen.ru/forum/attachment.php?attachmentid=13244&stc=1&d=1402413037

Символов DAD и SAD нет, т.к. используется безадресный заголовок SOH-ISI-FNC-DataHead.
Зеленым выделил то, из чего должна рассчитываться CRC.

melky
10.06.2014, 18:13
приборист я пробовал при помощи crc_gen расчитывать из зеленого, не то получается. где-то ошибка сидит.

Выставьте init 16#0 и вы получите правильную контрольную сумму из расчетного поля.

з.ы. если будут наработки какие-нибудь, делитесь. Меня эта Логика тоже интересует :)

Соответственно в коде ST тоже поменяйте crc := 16#FFFF; на crc := 16#0;
Код Си вроде тоже тогда соотвествует ST (проверял только оскатовской бибкой)

приборист
10.06.2014, 18:46
melky, спасибо.
Я через него тоже пробовал рассчитывать. Как и через онлайн калькулятор.
Меня вот эта строка смущает в руководстве:
if(crc & 0x8000) crc = (crc << 1) ^ 0x1021;

Может все таки не стандартный алгоритм подсчета CRC?

Придется Си учить :)

melky
10.06.2014, 18:49
приборист это проверка отрицательности числа, проверка старшего разряда на 1. Не знаю зачем, видимо так надо при расчете контрольной суммы., в такие дебри я не вдавался.

то есть проверяется старший бит, если он равен 1, то происходит сдвиг на 1 бит и ксорирование на полином. точнее на маску полинома.
В общем не забивайте голову.

приборист
10.06.2014, 18:56
приборист я пробовал при помощи crc_gen расчитывать из зеленого, не то получается. где-то ошибка сидит.

Выставьте init 16#0 и вы получите правильную контрольную сумму из расчетного поля.

Точно, вот она.
Спасибо огромное.



Соответственно в коде ST тоже поменяйте crc := 16#FFFF; на crc := 16#0;
Код Си вроде тоже тогда соотвествует ST (проверял только оскатовской бибкой)

Поменял в функции - тоже заработало.



з.ы. если будут наработки какие-нибудь, делитесь. Меня эта Логика тоже интересует :)


Ну пока что научился нормально её подсоединять по рс232 к компу, а то с оптопортом вечный гемморой :)
Теперь стабильная связь и можно параметры читать\записывать.

Сейчас определюсь до конца с параметрами (чтение архивов и тд)
А дальше надо будет пробовать несколько приборов в одну сеть и допиливать под свои нужды.

P.S.
Уже подумывал все необходимые запросы просмотреть сниффером, и записать все CRC :)
Но теперь ясно как её считать. Еще раз спасибо.

MihailVira
11.03.2016, 10:15
Всем добрый день! Пишу прогу для считывания данных в режиме master-slave с СПГ-761, прибора нет, есть только документация. Исходя из документации и сообщений прочитанных выше так и не понял что должно быть в байтах DAD и SAD и DataHead. Подскажите бестолковому плиз чему они равны :)

Yegor
11.03.2016, 14:40
Исходя из написанного прибористом, DAD и SAD просто отсутствуют, а исходя из документации содержимое DataHead интерпретируется согласно предыдущему FNC.

MihailVira
11.03.2016, 17:08
Про DataHead нашел в документации: содержит любое значение до 80 байт. А вот DAD и SAD я попробую оставить нулями тогда

MihailVira
30.03.2016, 17:53
А не могли бы гуру объяснить как парсить поле "Информация" в ответе функции 0x1D? Сколько байт отводится на Значение, Единицы измерения и Метку времени. И как потом это количество байт в полях интерпритировать :)

Programmist
27.04.2016, 09:58
Точно, вот она.
Спасибо огромное.



Поменял в функции - тоже заработало.



Ну пока что научился нормально её подсоединять по рс232 к компу, а то с оптопортом вечный гемморой :)
Теперь стабильная связь и можно параметры читать\записывать.

Сейчас определюсь до конца с параметрами (чтение архивов и тд)
А дальше надо будет пробовать несколько приборов в одну сеть и допиливать под свои нужды.

P.S.
Уже подумывал все необходимые запросы просмотреть сниффером, и записать все CRC :)
Но теперь ясно как её считать. Еще раз спасибо.

Приборист, как вам удалось опросить СПГ761 по RS-232? Можете написать поподробнее какие настройки использовали?