Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
dev:hardware:omron:protocol [2018/01/16 11:30]
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>​ 
 Запрос Запрос
 +<​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>​ </​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.
Строка 60: Строка 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ого бита).
  
  
Строка 92: Строка 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>​
  
  
  
  
dev/hardware/omron/protocol.1516091438.txt.gz · Последние изменения: 2018/01/16 11:30 — denis
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0