УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

Вопрос о ModBus


Автор Повідомлення
Повідомлення створено: 31. 01. 2013 [14:24]
AlexUS
Алексей Мальцев
Зареєстрован(а) с: 20.11.2011
Повідомлення: 9
Спасибо!Ответ на поставленный вопрос получил.
Задам последний,какие способы шифрования данных лучше использовать?
Повідомлення створено: 31. 01. 2013 [21:55]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
OpenSCADA имеет встроенную возможность шифрования трафика в открытых сетях:
http://wiki.oscada.org/Doc/SSL?v=1df

Лучшей защитой является зашифрованный трафик в зашифрованной сети vpn (двойное шифрование). Плюс система аутентификации (логин/пароль) с распределением полномочий (есть встроенная в OpenSCADA). Для сети vpn, организованной через интернет, достаточно одного реального ip-адреса для сервера vpn. Причём ip-адрес не обязательно должен быть статическим. Для динамического, но реального ip-адреса, можно использовать сервисы динамических DNS. Для клиентов vpn-сети вообще не важно какого вида ip-адрес используется, то есть работают за NAT и через прокси.
http://ru.wikipedia.org/wiki/Virtual_Private_Network
http://ru.wikipedia.org/wiki/OpenVPN
http://ru.wikipedia.org/wiki/OpenSSL
http://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_DNS

В Вашем случае контроллер является частично программируемым и вряд ли получится развернуть vpn-сеть и организовать шифрование трафика. Поэтому для новых систем стоит выбирать более открытые контроллеры. Можно поставить посредника с Linux и OpenSCADA на борту между Вашим контроллером и модемом. Он выполнит задачи сервера Modbus для контроллера, дозвона в интернет PPP, перезвона в случае обрывов соединения, vpn-клиента, шифрования-уменьшения-сжатия трафика и др. Для этого подойдут любые недорогие миникомпьютеры типа Raspberry Pi (ARM), или несколько дороже NISE-104 (Intel).
http://ru.wikipedia.org/wiki/Raspberry_Pi

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 31. 01. 2013 [22:26]
AlexUS
Алексей Мальцев
Зареєстрован(а) с: 20.11.2011
Повідомлення: 9
Огромное спасибо за столь развернутый ответ!
Буду реализовывать,делиться своим опытом и проектами!
Повідомлення створено: 27. 02. 2013 [21:31]
AlexUS
Алексей Мальцев
Зареєстрован(а) с: 20.11.2011
Повідомлення: 9
Здравствуйте!
Вопрос больше к Алмазу наверное, но если другие откликнуться,буду рад.
Так как я не особо силен в программировании,то я столкнулся с такой проблемой:
в скаду поступают данные из контроллера (способ передачи не вижу смысла описывать,так как вопрос не в этом,но если что он описан в предыдущих вопросах,месяцем ранее в данной теме) с помощью модема. Модем отсылает пакеты данных,в скаде получаю 8-ми битные регистры. Суть в том, что надо передавать числа большой разрядности, например на 16 и 32 бита,одним пакетом число передать не получается (ну или это возможно но я не знаю как, если подскажите также буду признателен), поэтому приходится разбивать данные предварительно на 8-ми битный пакет в контроллере и передавать по кускам. Соответственно, после приема в скаду, я должен собрать из этих отдельных частей реальное число, которое я изначально разбивал в контроллере. Как я собираю их с помощью ява языка представлено на скрине. И все бы было нормально, но только порой возникают проблемы с этим. Я думаю я неправильно собираю их с помощью кода и есть какое-то другое решение по компановке 8-ми битных регистров в 16 и 32 битные. Потому что при моей компановке число изначально отображается нормально, к примеру 1 300 000, потом оно растет по мере накопления, доходит к примеру до 1 305 023 и при следующей передачи данных становится 68 759 (точные числа не помню указаны приблизительно), потом проходит время, накапливается до определенного разряда и вновь выдает нормальное значение 1 321 011 и продолжает расти. Я понимаю, что ошибка где- то в чередовании разрядов,но как ее исправить не нашел. Помогите, пожалуйста!
Огромное спасибо!
Вкладений файл

2013-02-27 23 15 31.png (Тип файлу: image/png, Розмір: 8.17 кілобайтів) — 560 завантажень
Повідомлення створено: 28. 02. 2013 [08:03]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
"AlexUS" wrote:
Модем отсылает пакеты данных,в скаде получаю 8-ми битные регистры. Суть в том, что надо передавать числа большой разрядности, например на 16 и 32 бита,одним пакетом число передать не получается (ну или это возможно но я не знаю как, если подскажите также буду признателен), поэтому приходится разбивать данные предварительно на 8-ми битный пакет в контроллере и передавать по кускам.
Склеить обратно несложно с помощью сдвига соответствующих байт на 8, 16, 24 разряда (младший байт не сдвигается) и последующим логическим ИЛИ всех полученных значений. Это для получения беззнакового целого. Если есть знак, то дополнительно надо сделать, например для 16-битного: if (in > 32767) out = in-65536; else out = in;
"AlexUS" wrote:
после приема в скаду, я должен собрать из этих отдельных частей реальное число, которое я изначально разбивал в контроллере.
Чтобы собрать реальное число нужно знать какие из полученных битов представляют собой знак, порядок и мантиссу реального числа, выделить эти биты и произвести математические оперции. На скрине (можно было текстом скопировать) видно, что пытаетесь получить целое число, а не реальное.

В общем, надо знать исходный формат числа ещё в контроллере побитно и разбивку. Строковые операции вряд ли тут нужны.

[Повідомлення редагувалось 1 раз(ів), останній раз 28.02.2013 в 08:11.]

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 01. 03. 2013 [20:18]
AlexUS
Алексей Мальцев
Зареєстрован(а) с: 20.11.2011
Повідомлення: 9
Здравствуйте!

Простите если вопрос слишком элементарный но застрял.
Вопрос из предыдущей теме о сборе из 8-ми битных пакетов данных 16 и 32 битные.
Приходят 2 регистра: R1 - регистр который должен быть старшим в 16-битном числе
R2-рег который младший. Делаю так:
A=(R5w<<8)||R6w. Но в итоге пишет единицу.
Что не так?почему не могу получить реальное число?
Заранее спасибо
Повідомлення створено: 01. 03. 2013 [21:20]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
Надо 1 знак "|" для поразрядного ИЛИ
http://wiki.oscada.org/Doc/JavaLikeCalc?v=pmd#h101-5

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 01. 03. 2013 [21:48]
AlexUS
Алексей Мальцев
Зареєстрован(а) с: 20.11.2011
Повідомлення: 9
Но тогда он показывает мне почему-то только вторые 8 бит.
К примеру, реальное число которое я изначально разбивал в контроллере 1 300 000, если в 16-ричном коде 13 D620.
Соответственно в одном регистре из контроллера мне приходит число 54816 т.е D620 (допустим это R1)
в другом - 19,т.е. 13 (а это R2)
Делаю следующее,как вы говорите:

Rez=(R2<<8)|R1

Но в итоге скада показывает число 54816. Почему нет расширения разряда? Ведь по сути должен показывать реальное 1300000?

Спасибо за помощь.
Повідомлення створено: 01. 03. 2013 [22:19]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
Сдвиг надо на 16, так как это уже не байты, 16-битные слова.

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 20. 03. 2013 [09:55]
coderator
vitaly koubarev
Зареєстрован(а) с: 20.03.2013
Повідомлення: 3
Я не знаток в модбасе, поэтому прошу помощи форумчан в решении проблемы.
Подключено простенькое устройство, которое управляет 8-ю реле, на нем один регистр на запись.
В принципе работает (щелкает и моргает), но тревожит меня то, что ошибка вылазит каждый раз.
В Oscada настроены: последовательный порт, транспорт модбас, контроллер модбас и один его параметр (R:0:w:reg0).
Привожу логи.

1. задаю значение регистру, появляется ошибка "Функция не поддерживается"; в отчете:
JAVASCRIPT
20-03-2013 10:58:47 RTU: 'controller2' --> 1(Serial.com3_out)
Запрос -> 01 06 00 00 00 59 49 f0 
Ошибка -> 1:06:Функция не поддерживается. -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:58:47 RTU: Serial.com3_in() --> 1
Запрос -> 01 06 00 00 00 59 49 f0 
Ответ -> 01 86 02 c3 a1


2. посылаю запрос в последовательный порт; в логе:
JAVASCRIPT
запрос
01 06 00 00 00 51 48 36 
ответ
01

в отчете:
JAVASCRIPT
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 86 01 83 a0 
Ответ -> 01 86 01 83 a0 
 
20-03-2013 10:47:52 RTU: Serial.com3_in() --> 1
Запрос -> 01 06 00 00 00 51 48 36 
Ответ -> 01 86 02 c3 a1


Тестил девайс из-под винды в modbus poll, там все лаконично:
JAVASCRIPT
000000-Tx:01 06 00 00 00 2D 49 D7
000001-Rx:01 06 00 00 00 2D 49 D7
000002-Tx:01 06 00 00 00 00 89 CA
000003-Rx:01 06 00 00 00 00 89 CA
000004-Tx:01 06 00 00 00 00 89 CA
000005-Rx:01 06 00 00 00 00 89 CA

проблем нет.

Вопросы:
- из-за чего ошибка?
- как понимать записи "Serial.com3_in() --> 1" и "'controller2' --> 1(Serial.com3_out)"?
- откуда, зачем и почему запросы "01 86 01 83 a0", да еще так много?

С уважением.

[Повідомлення редагувалось 1 раз(ів), останній раз 20.03.2013 в 10:26.]



8100