Автор |
Повідомлення |
Повідомлення створено: 15. 04. 2010 [13:57]
|
ruslan
Руслан Нургалин
Автор теми
Зареєстрован(а) с: 25.06.2009
Повідомлення: 15
|
Запрос:
:060300030001F3 [0D] [0A]
Ответ:
:0603040005FC945E [0D] [0A]
[Повідомлення редагувалось 1 раз(ів), останній раз 15.04.2010 в 14:01.]
|
Повідомлення створено: 15. 04. 2010 [14:13]
|
kuzulis
Денис Шиенков
Зареєстрован(а) с: 10.07.2009
Повідомлення: 128
|
у меня на запрос:
адрес у-ва = 6
код ф = 3
стартовый регистр = 0
кол-во = 1
выдает это:
:060300030001F3[0d][0a]
Упс.. неуспел
[Повідомлення редагувалось 2 раз(ів), останній раз 15.04.2010 в 14:15.]
|
Повідомлення створено: 15. 04. 2010 [14:22]
|
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
|
Значит контрольная сумма в OpenSCADA теперь считается правильно. А вот ответ на запрос от данного прибора нестандартный. Выдаёт 4-байтное значение регистра.
:0603040005FC945E [0D] [0A]
06 адрес, 03 выполненная команда, 04 кол-во байт, далее 4 байта данных старшими байтами вперёд (число 0x0005FC94), 5E LRC
[Повідомлення редагувалось 2 раз(ів), останній раз 15.04.2010 в 14:36.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Повідомлення створено: 15. 04. 2010 [15:26]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
almaz wrote:
Значит контрольная сумма в OpenSCADA теперь считается правильно.
Исходя из всего вышесказанного у меня по этому поводу уже есть сомнения. Кстати, нашёл библиотеку от Moxa и там имеем:
u8 LRC( const u8 *buf, int len)
{
unsigned char ch=0;
if ( len <= 0 || buf == 0 )
return(MB_ERROR_PARAMETER);
while ( len-- )
ch += (unsigned char)*buf++;
return(ch);
}
almaz wrote:
А вот ответ на запрос от данного прибора нестандартный. Выдаёт 4-байтное значение регистра.
:0603040005FC945E [0D] [0A]
06 адрес, 03 выполненная команда, 04 кол-во байт, далее 4 байта данных старшими байтами вперёд (число 0x0005FC94), 5E LRC
А вот по этому поводу я бы связался с разработчиком. Что-бы безосновательно заявлять подобное не повадно было:
В приборе реализован стандартный для промышленных
контроллеров протокол MODBUS - режим ASCII, семибитный с кон-
тролем четности/нечетности и одним стоповым битом либо без
контроля четности с двумя стоповыми битами.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 15. 04. 2010 [15:36]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
Вырезка из официальной спецификации:
Primary tables: Object type : Type of : Comments
Discretes Input: Single bit : Read-Only : This type of data can be provided by an I/O system.
Coils: Single bit : Read-Write : This type of data can be alterable by an application program.
Input Registers: 16-bit word : Read-Only : This type of data can be provided by an I/O system
Holding Registers: 16-bit word : Read-Write : This type of data can be alterable by an application program.
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 15. 04. 2010 [15:51]
|
kuzulis
Денис Шиенков
Зареєстрован(а) с: 10.07.2009
Повідомлення: 128
|
Хм... это получается, что разработчики не врали .. и в Open Scada нужно убирать проверку поля quantity_bytes в принятом PDU чтобы это не считалось ошибкой! (если конечно такая проверка есть)
ЗЫ: для Coils и Holding Registers
[Повідомлення редагувалось 2 раз(ів), останній раз 15.04.2010 в 15:54.]
|
Повідомлення створено: 15. 04. 2010 [15:59]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
kuzulis wrote:
Хм... это получается, что разработчики не врали .. и в Open Scada нужно убирать проверку поля quantity_bytes в принятом PDU чтобы это не считалось ошибкой! (если конечно такая проверка есть)
Врали, в OpenSCADA quantity_bytes вообще не проверяется. Однако сейчас уже проверяется соответствие размера PDU. И это никаким образом не оправдывает нарушение стандарта и откровенную ложь!
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 15. 04. 2010 [16:02]
|
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
|
По контрольной сумме не всё понятно. Наткнулся при поиске как минимум на 4 варианта LRC. Википедия даёт следующее:
http://en.wikipedia.org/wiki/Modbus
отсюда ссылка ведёт вот сюда
http://en.wikipedia.org/wiki/Longitudinal_redundancy_check
А там алгоритм вот какой:
Set LRC = 0
For each byte b in the buffer
do
Set LRC = LRC XOR b
end do
Кроме того есть два варианта выбора байт для сложения: байты передаваемые в линию и байты до кодирования в ASCII.
Но, судя по описаниям многих устройств, они работают с той LRC которая сейчас в коде...
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Повідомлення створено: 15. 04. 2010 [16:05]
|
kuzulis
Денис Шиенков
Зареєстрован(а) с: 10.07.2009
Повідомлення: 128
|
Врали, в OpenSCADA quantity_bytes вообще не проверяется.
ИМХО, не врали, т.к. в стандарте что вы привели написано, что размер регистра может быть изменен как угодно!!! Вот они и увеличили его до 4-х байт.
Однако сейчас уже проверяется соответствие размера PDU. И это никаким образом не оправдывает нарушение стандарта и откровенную ложь!
хм.. а почему тогда у топикстарьера не читаются остальные "регистры" ? в чем может быть проблема?
в том что запросили 1 16-ти битный регистр - а получили 2 "как бы 16-ти" битных регистра?
|
Повідомлення створено: 15. 04. 2010 [16:06]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
almaz wrote:
Но, судя по описаниям многих устройств, они работают с той LRC которая сейчас в коде...
Тогда оставляем до следующего прецедента.
Learn, learn and learn better than work, work and work.
|