Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
dev:hardware:omron:protocol [2018/01/16 11:33] denis |
dev:hardware:omron:protocol [2019/12/02 07:07] (текущий) vitaly |
||
---|---|---|---|
Строка 9: | Строка 9: | ||
Заголовочная часть запроса очень сложная и для нас практически не меняется, т.к. непонятные поля нужны для сложной связи когда пакет проходит через контроллер как через маршрутизатор уходит в другую сеть, может даже не ethernet, там связывается с другим контроллером и тот уже передает ее устройству назначения. кстати, устройствами назначения могут быть не только ПЛК, а что угодно. Протокол FINS не привязан к средам передачи и устройствам, поэтому на нем возможны сложные передачи данных, когда два компа общаются между собой через контроллеры соединенные второй линией профибаса в соседних цехах, причем сами разговаривать с контроллером на ethernet/usb или RS. Естественно, протокол сам ничего не делает, надо заранее все прописать в настройках, сформировать сети, пронумеровать всю последовательность передач, на это собственно и нужно столько полей. Мы ставим, что ничего не надо никуда транслировать, мы общаемся напрямую, и забываем про все поля. Итого сам заголовок выглядит так: | Заголовочная часть запроса очень сложная и для нас практически не меняется, т.к. непонятные поля нужны для сложной связи когда пакет проходит через контроллер как через маршрутизатор уходит в другую сеть, может даже не ethernet, там связывается с другим контроллером и тот уже передает ее устройству назначения. кстати, устройствами назначения могут быть не только ПЛК, а что угодно. Протокол FINS не привязан к средам передачи и устройствам, поэтому на нем возможны сложные передачи данных, когда два компа общаются между собой через контроллеры соединенные второй линией профибаса в соседних цехах, причем сами разговаривать с контроллером на ethernet/usb или RS. Естественно, протокол сам ничего не делает, надо заранее все прописать в настройках, сформировать сети, пронумеровать всю последовательность передач, на это собственно и нужно столько полей. Мы ставим, что ничего не надо никуда транслировать, мы общаемся напрямую, и забываем про все поля. Итого сам заголовок выглядит так: | ||
- | 80 00 03 00 00 00 00 09 00 №№ | + | <code>80 00 03 00 00 00 00 09 00 №№ </code> |
каждая цифра это один байт в HEX | каждая цифра это один байт в HEX | ||
- | 80 - говорит, что мы хотим ответ на наш запрос, а не молча выполнить его. | + | **80** - говорит, что мы хотим ответ на наш запрос, а не молча выполнить его. |
- | №№ - это порядковый номер запроса. Начинаем с 00 и пошли увеличивать. Нужно для правильного разбора, что бы ответ от старого запроса не принять за текущий. | + | **№№** - это порядковый номер запроса. Начинаем с 00 и пошли увеличивать. Нужно для правильного разбора, что бы ответ от старого запроса не принять за текущий. |
- | Так же возможна последовательность: 80 00 03 00 FA 00 00 09 00 №№ | + | Так же возможна последовательность: <code>80 00 03 00 FA 00 00 09 00 №№</code> |
После этого добавляется команда и параметры команды. | После этого добавляется команда и параметры команды. | ||
Строка 24: | Строка 24: | ||
Считывание: | Считывание: | ||
- | 01 01 KK AA AA AA NN NN | + | <code>01 01 KK AA AA AA NN NN</code> |
- | Сначала код команды считывания области памяти 01 01 | + | Сначала код команды считывания области памяти **01 01** |
- | Потом KK - это код области памяти и тип данных. Тут надо почитать таблицу 5-2-2 мануала и определить, что поскольку мы работаем только с областью CIO и размениваться на биты не желаем, а хотим затягивать сразу словами, то у нас этот байт всегда равен B0. | + | Потом **KK** - это код области памяти и тип данных. Тут надо почитать таблицу 5-2-2 мануала и определить, что поскольку мы работаем только с областью CIO и размениваться на биты не желаем, а хотим затягивать сразу словами, то у нас этот байт всегда равен B0. |
- | Далее AA-AA-AA адрес начала области чтения, причем первые AA-AA это байты, а последний AA это биты. Помним, что мы настроили модули ввода на область CIO 3300, но тут 3300 это десятичная система, а в hex это у нас 0C E4, а биты нам нужны все с нулевого поэтому на конце 00 (экспериментально подобрал). Итого адрес OC E4 00. | + | Далее **AA-AA-AA** адрес начала области чтения, причем первые **AA-AA** это байты, а последний **AA** это биты. Помним, что мы настроили модули ввода на область CIO 3300, но тут 3300 это десятичная система, а в hex это у нас 0C E4, а биты нам нужны все с нулевого поэтому на конце 00 (экспериментально подобрал). Итого адрес OC E4 00. |
- | NN-NN сколько слов читать. | + | **NN-NN** сколько слов читать. |
Итого: | Итого: | ||
Запрос | Запрос | ||
+ | <code> | ||
80 00 03 00 00 00 00 09 00 ZZ 01 01 B0 0C E4 00 00 01 | 80 00 03 00 00 00 00 09 00 ZZ 01 01 B0 0C E4 00 00 01 | ||
- | ZZ - меняем на хоть что | + | </code> |
+ | **ZZ** - меняем на хоть что | ||
Ответ, приходит через ~5 мс: | Ответ, приходит через ~5 мс: | ||
- | C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 0F 0C | + | <code>C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 0F 0C |
+ | </code> | ||
Что значит ответ, можно почитать в разделе 3-3-3 мануала: | Что значит ответ, можно почитать в разделе 3-3-3 мануала: | ||
- | С0 это заголовок. мы посылали 80, т.е. 1000 hex, он ответил нам 1100 hex, взведенный битик говорит, что это ответ, а не запрос. | + | С0 это заголовок. мы посылали 80, т.е. 1000 0000 bin , он ответил нам 1100 0000 bin, взведенный битик говорит, что это ответ, а не запрос. |
- | 00 02 - всегда так | + | **00 02** - всегда так |
далее непереводимая комбинация, которая означает все те маршрутизирующие поля, которые мы не трогаем, только и источник (первые 3 байта) поменян местами с приемником (следующие 3 байта). | далее непереводимая комбинация, которая означает все те маршрутизирующие поля, которые мы не трогаем, только и источник (первые 3 байта) поменян местами с приемником (следующие 3 байта). | ||
- | ZZ это наш счетчик | + | **ZZ** это наш счетчик |
- | Далее идет дубликат команды команды 01 01 | + | Далее идет дубликат команды команды **01 01** |
- | Потом код завершения 00 00 - выполнилась, нет ошибок (коды см 5-1-3 мануала) | + | Потом код завершения **00 00** - выполнилась, нет ошибок (коды см 5-1-3 мануала) |
Ну и само слово из памяти, которое мы запрашивали: 0F 0C. | Ну и само слово из памяти, которое мы запрашивали: 0F 0C. | ||
Строка 58: | Строка 61: | ||
+ | Чтение по отдельным регистрам | ||
- | Запись: 01 02 KK AA AA AA NN NN FF FF .... | + | <code>01 04 KK AA AA AA [ KK AA AA AA ]</code> |
- | Код команды 01 02 | + | Сначала код команды считывания отдельных регистров **01 04** |
- | KK, AA-AA-AA и даже NN-NN аналогично команде чтения. мы помним, что выводы модулей мы поместили в ячейки CIO 3200. Поэтому адрес записи у нас 0С 80 00. | + | Потом **KK** - это код области памяти и тип данных. Тут надо почитать таблицу 5-3 мануала и определить, что поскольку мы работаем только с областью CIO и размениваться на биты не желаем, а хотим затягивать сразу словами, то у нас этот байт равен B0. |
- | Далее FF - данные которые нужно записать. Естественно, количество байт должно быть равно числу слов умножить на 2. | + | Далее **AA-AA-AA** адрес слова которое будем читать, причем первые **AA-AA** это байты, а последний **AA** это биты. Помним, что мы настроили модули ввода на область CIO 3300, но тут 3300 это десятичная система, а в hex это у нас 0C E4, а биты нам нужны все с нулевого поэтому на конце 00 (экспериментально подобрал). Итого адрес OC E4 00. |
+ | |||
+ | Далее, можно указать еще адреса регистров, которые надо прочитать. Они дополнительно дописываются, так же по 4 байта "KK AA AA AA". | ||
+ | |||
+ | |||
+ | |||
+ | Итого: | ||
+ | Запрос | ||
+ | <code> | ||
+ | 80 00 03 00 00 00 00 09 00 ZZ 01 04 B0 0C E4 00 B0 0C E5 00 | ||
+ | </code> | ||
+ | |||
+ | **ZZ** - меняем на хоть что | ||
+ | Ответ, приходит через ~5 мс: | ||
+ | <code>C0 00 02 00 09 00 00 00 00 ZZ 01 04 00 00 B0 00 28 B0 00 00 | ||
+ | </code> | ||
+ | |||
+ | Начальная часть аналогична команде чтения. | ||
+ | |||
+ | Далее идет дубликат команды команды **01 04** | ||
+ | |||
+ | Потом код завершения **00 00** - выполнилась, нет ошибок (коды см 5-1-3 мануала) | ||
+ | |||
+ | Далее идет список: код области памяти (байт) - значение (слово). | ||
+ | Мы запрашивали два слова из области B0. Ответ B0 00 28 B0 00 00 - означает что это CIO с значением 0028h и CIO с значением 0000h. | ||
+ | |||
+ | |||
+ | |||
+ | Добавление, как работать и битами. | ||
+ | В протоколе 1бит данных записывается как 1 байт, т.е. если надо считать 5 бит, то в ответе на команду будет 5 байт (см. последний столбец в таблице откуда берем коды областей). Причем каждый из этих байт будет иметь значение 00h или 01h. | ||
+ | Например: мы хотим запросить 20h битов начиная с адреса 0CEE | ||
+ | Команда будет такая 01 01 30 0C EE 00 00 20 | ||
+ | 01 01 - это команда чтения регистров (для команды 01 04 логика аналогична) | ||
+ | 30 - код области памяти CIO только при побитовом чтении. | ||
+ | 0C EE 00 - адрес регистра. причем последний 00 это номер бита в регистре. | ||
+ | 00 20 - это сколько бит читать (32 штуки). | ||
+ | |||
+ | Ответ: | ||
+ | 01 01 00 00 00 00 01 00 01 01 00 00 00 01 00 00 01 00 00 00 00 00 00 01 01 01 01 00 00 01 01 00 01 00 01 00 | ||
+ | |||
+ | В начале идет | ||
+ | 01 01 - команда | ||
+ | 00 00 - код ответа все хорошо | ||
+ | Данные 32 байта: 00 00 01 00 01 01 00 00 00 01 00 00 01 00 00 00 00 00 00 01 01 01 01 00 00 01 01 00 01 00 01 00 | ||
+ | |||
+ | Каков порядок следования битов в ответе ? Вот такой: | ||
+ | 0CEE:0 бит, 0CEE:1 бит, ...., 0CEE:15 бит, 0CEF:0 бит, 0CEF:1 бит, ..., 0CEF:15 бит | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Запись: <code>01 02 KK AA AA AA NN NN FF FF ....</code> | ||
+ | |||
+ | Код команды **01 02** | ||
+ | |||
+ | **KK**, **AA-AA-AA** и даже **NN-NN** аналогично команде чтения. мы помним, что выводы модулей мы поместили в ячейки CIO 3200. Поэтому адрес записи у нас 0С 80 00. | ||
+ | |||
+ | Далее **FF** - данные которые нужно записать. Естественно, количество байт должно быть равно числу слов умножить на 2. | ||
Пример запроса, зажигает светодиоды на ICP DAS: | Пример запроса, зажигает светодиоды на ICP DAS: | ||
- | 80 00 03 00 00 00 00 09 00 ZZ 01 02 B0 0C 80 00 00 01 00 FF | + | <code>80 00 03 00 00 00 00 09 00 ZZ 01 02 B0 0C 80 00 00 01 00 FF</code> |
(потушить можно заменив байт в конце на 00) | (потушить можно заменив байт в конце на 00) | ||
Ответ: | Ответ: | ||
- | C0 00 02 00 09 00 00 00 00 ZZ 01 02 00 00 | + | <code>C0 00 02 00 09 00 00 00 00 ZZ 01 02 00 00</code> |
структура ответа полностью аналогична чтению | структура ответа полностью аналогична чтению | ||
+ | |||
+ | |||
+ | Примечание: Пример побитового режима записи. | ||
+ | Запишем в область CIO3200 бит 0. Код области CIO для побитового режима 30h. В hex адрес будет выглядеть как 0C 80. Далее ставим смещение бита в слове (00 - нулевой бит). Записывать будем 1 элемент (бит), значит ставим 00 01h. Потом область данных длинной количество элементов умножить на байт (размер байт берется из таблицы раздела 5-3-3). У нас 1 элемент значит 1 байт. Значение байта может быть или 00h или 01h. В первом примере отсылается 0, во втором 1. Ответ код команды, и код успешного выполнения 00 00h. | ||
+ | |||
+ | [10:53:58,781] <--:80000300000000090003 01 02 30 0C 80 00 00 01 00 | ||
+ | [10:53:58,793] -->:C0000200090000000003 01 02 00 00 | ||
+ | |||
+ | [10:54:07,363] <--:80000300000000090004 01 02 30 0C 80 00 00 01 01 | ||
+ | [10:54:07,375] -->:C0000200090000000004 01 02 00 00 | ||
+ | |||
+ | Если надо установить 10ый бит, то смещение 0A. | ||
+ | [11:04:17,195] <--:8000030000000009000D 01 02 30 0C 80 0A 00 01 01 | ||
+ | [11:04:17,203] -->:C000020009000000000D 01 02 00 00 | ||
+ | В примере, если до выполнения было 0000h, то после выполнения станет 0400h (взведение 10ого бита). | ||
Строка 90: | Строка 166: | ||
Ну и на последок команда чтения. Запрос 3х слов из области CIO 1557 (т.е. 06 15 в hex) | Ну и на последок команда чтения. Запрос 3х слов из области CIO 1557 (т.е. 06 15 в hex) | ||
- | 80 00 03 00 00 00 00 09 00 ZZ 01 01 B0 06 15 00 00 03 | + | <code>80 00 03 00 00 00 00 09 00 ZZ 01 01 B0 06 15 00 00 03</code> |
Ответы: | Ответы: | ||
все опрашивается: | все опрашивается: | ||
- | C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 11 07 01 02 20 | + | <code>C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 11 07 01 02 20</code> |
тут 0701 это время | тут 0701 это время | ||
отключили 5 модуль: | отключили 5 модуль: | ||
- | C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 10 07 20 02 00 | + | <code>C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 10 07 20 02 00</code> |
отключили 9 модуль: | отключили 9 модуль: | ||
- | C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 10 07 42 00 20 | + | <code>C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 10 07 42 00 20</code> |
отключили и 5 и 9 модули: | отключили и 5 и 9 модули: | ||
- | C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 10 07 58 00 00 | + | <code>C0 00 02 00 09 00 00 00 00 ZZ 01 01 00 00 00 10 07 58 00 00</code> |