PDA

Просмотр полной версии : MK110 Управление выходами по Modbus



krainov
03.08.2016, 17:02
Здравствуйте!
Пишем свою простенькую систему управления включением освещения на C# под web. Заметим, что это наш первый опыт взаимодействия с устройствами по COM портам: никогда не трогали, занимались только вебом (менюшки, формочки, картиночки :-)
В проекте учавствуют 5шт МК110-8Д. Пытаемся начать писать во конкретные выходы конкретного устройства используя ModBus команду на Write Single Coils - 0x05 (взято из спецификации).
В порт уходит (согласно ModBus Protocol Specification V.1.1b3):
byte[] message = {
settings.Address, //Адрес устройства
Convert.ToByte(0x05), //Команда на запись
Convert.ToByte(0), //2 байта Адреса выхода
Convert.ToByte(0),
Convert.ToByte(0), //2 байта значения выхода
Convert.ToByte(1),
0,0 (CRC, опущен)
};

Уходить, то уходит, но пока безрезультатно...
Пожалуйста помогите разобраться! Сидим уже 3-й день )))
Спасибо!

P.S. С устройством все в пордяке: связь есть, работает, читаем значения выходов маской.

petera
03.08.2016, 17:36
Здравствуйте!
Пишем свою простенькую систему управления включением освещения на C# под web. Заметим, что это наш первый опыт взаимодействия с устройствами по COM портам: никогда не трогали, занимались только вебом (менюшки, формочки, картиночки :-)
В проекте учавствуют 5шт МК110-8Д. Пытаемся начать писать во конкретные выходы конкретного устройства используя ModBus команду на Write Single Coils - 0x05 (взято из спецификации).
В порт уходит (согласно ModBus Protocol Specification V.1.1b3):
byte[] message = {
settings.Address, //Адрес устройства
Convert.ToByte(0x05), //Команда на запись
Convert.ToByte(0), //2 байта Адреса выхода
Convert.ToByte(0),
Convert.ToByte(0), //2 байта значения выхода
Convert.ToByte(1),
0,0 (CRC, опущен)
};

Уходить, то уходит, но пока безрезультатно...
Пожалуйста помогите разобраться! Сидим уже 3-й день )))
Спасибо!

P.S. С устройством все в пордяке: связь есть, работает, читаем значения выходов маской.

Если "CRC, опущен", то модуль игнорирует эту телеграмму.
Кроме того https://ru.wikipedia.org/wiki/Modbus#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80. D1.82.D0.BD.D1.8B.D0.B5_.D0.BA.D0.BE.D0.B4.D1.8B_. D0.BE.D1.88.D0.B8.D0.B1.D0.BE.D0.BA

Запись одного значения
5 (0x05) — запись значения одного флага (Force Single Coil).
6 (0x06) — запись значения в один регистр хранения (Preset Single Register).
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).

Для регистра хранения значение является просто 16-битным словом.
Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.
Если команда выполнена успешно, ведомое устройство возвращает копию запроса

А у Вас почему-то
Convert.ToByte(0), //2 байта значения выхода
Convert.ToByte(1),

ЗЫ.
И самое главное модуль не поддерживает команду Write Single Coils - 0x05
Допустимо использовать только 15 (0x0F) — запись значений в несколько регистров флагов (Force Multiple Coils)
25689

Пример использования команды 0x0F есть в по ссылке
25690

Гарчев Евгений
03.08.2016, 17:47
Convert.ToByte(0x05), //Команда на запись

модуль не поддерживает 5-ую функцию, на запись модуль поддерживает функции 0х10 и 0х0f.

krainov
03.08.2016, 18:54
Спасибо за наводку!
Заработал

In case someone needs the solution

//команда на запись во вход
byte[] message = {
settings.Address,
0x0F,

//адрес ВЭ
0x00,
0x00,

//кол-во ВЭ
0x00,
0x04,

//кол-во байт маски
0x01,

//маска
0x01,

0,0 //CRC - опущен (но необходим)
};