PDA

Просмотр полной версии : Modbus String Output Module - передает лишние нули



StarJedy
06.11.2015, 16:54
ПЛК110 связывается с устройством через RS-485 по Modbus.
В устройство необходимо задать три параметра, через функцию 0х10 Modbus (Preset Multiple Registers), причем устройство не поддерживает запись по одному регистру, надо записывать сразу все три одной командой (не спрашивайте почему, так написал программист разработавший устройство), т.е.:
01 10 00 06 00 03 06 00 01 00 02 00 03 {2 байта CRC}, где:
01 - адрес устройства
10 - функция 0х10 Modbus (Preset Multiple Registers)
00 06 - адрес регистра для записи
00 03 - количество регистров для записи
06 - количество байт для записи
00 01 00 02 00 03 - передаваемые данные

Для передачи в таком виде пытаюсь использовать String Output Modulу с параметрами
Command: Preset Multiple Registers 0х10
Register Address: 6
Amount byte: 6

Данные в строку пишу через указатель:

pt : POINTER TO BYTE;

pt := ADR(MB_OUT_STRING);
pt^ := 1;
pt := pt + 1;
pt^ := 0;
pt := pt + 1;
pt^ := 2;
pt := pt + 1;
pt^ := 0;
pt := pt + 1;
pt^ := 3;
pt := pt + 1;
pt^ := 0;

В результате ПЛК передает следующее:
01 10 00 06 00 03 06 00 00 00 00 00 01 {2 байта CRC}
Т.е. первые два регистра передаются нулевыми значениями.

Если увеличить параметр Amount byte до 10 (т. е. передается уже не 3, а 5 регистров), то передаются все данные, но первые два регистра все равно нулевые:
01 10 00 06 00 05 0A 00 00 00 00 00 01 00 02 00 03

Откуда эти нули : 00 00 00 00 , как от них избавится, что я делаю не так?
Может есть какой то другой, более правильный способ записи нескольких регистров одной командой, а не через String Output Module ?

capzap
06.11.2015, 18:02
начните от обратного, в конфигураторе задайте какую нибудь строку, а через указатели разберите на сомтавляющие, в тех ли местах рпсположены данные

Knive87
06.11.2015, 18:30
А что вы мучаетесь? Я так понимаю тип WORD (2 байта)? Ну и кидайте массивом. http://www.owen.ru/forum/showthread.php?t=22372 Только вместо REAL, WORD делайте и Amount byte 6 соответственно. У меня было как-то нужно записать REAL+WORD+WORD массивом и ничего, так что у вас все получится!

StarJedy
09.11.2015, 11:53
Спасибо Knive87, с записью через массив все работает как надо.