PDA

Просмотр полной версии : СПК107 modbus slave



Votrj1
28.04.2015, 01:11
Первый раз взял в руки СПК.
С modbus master понятно работает.
Ткните носом в док. где описывается как настроить один из портов в "modbus slave" и соответственно откуда потом читать мастером сети (регистры)?

Ладно нашел что "Modbus_Serial_Device" это и есть модбас слейв - написано мелкими буквами.
Как привязать на чтение из СПК несколько переменных допустим одну Real другую Int.
С конфигурированием мастера все понятно, а тут как? Ругается. Подскажите.

Zecher
30.04.2015, 16:39
В этом "Modbus_Serial_Device" есть настройка входных и выходных переменных. Задаём их количество. Далее аналогично, как в мастере, присваиваем переменные. Адреса этих регистров идёт по-порядку начиная с 0.

Votrj1
30.04.2015, 21:36
Если бы аналогично. Там в мастере задается для каждой переменной свой канал с описанием индивидуальной длины в словах. А здесь в slave нет такого, общий массив word. Если переменные разной длины, то в лоб не получится. Делать объединение и накладывать на этот массив как в СИ и потом на бумажке соображать где начало каждой переменной, чтоб вычислить адрес от 0? Так что ли? Ну хоть где то бы написали.

Votrj1
04.05.2015, 17:58
Все молчат. Как будто я либо дурь спросил или никто не знает?

_Mikhail
04.05.2015, 18:03
Тебе же уже написали порядок действий. Задаешь количество необходимых тебе регистров, и затем в эти регистры записываешь свои переменные.

Votrj1
04.05.2015, 20:15
Я наверно слепой. Как в мастере слейв режима "Modbus_Serial_Device" добавить несколько переменных. Нет там кнопки добавить канал как в режиме "мастер". А попытка прописать несколько переменных прямо в массив Ворд получается ошибка. Например я два real попытался с зазором с учетом что он занимает 2х16.

_Mikhail
04.05.2015, 20:27
Для передачи переменной REAL, ее сначала надо разделить на две переменные WORD

Votrj1
04.05.2015, 20:40
Я уж стесняюсь спросить как развалить, в транскрипции данного языка, я с ним не очень еще пока знаком, хотя теоретически понятно, но за подсказку заранее спасибо.
Те получается, что имеется один массив N-ой длины и в него можно положить только 16ти разрядные Int, так? А byte?
Все остальное надо преобразовывать.

Сбивает то что если голову массива связать с real то все расписывается автоматически, но только для одной переменной.

александр 64
04.05.2015, 20:43
Я наверно слепой. Как в мастере слейв режима "Modbus_Serial_Device" добавить несколько переменных. Нет там кнопки добавить канал как в режиме "мастер". А попытка прописать несколько переменных прямо в массив Ворд получается ошибка. Например я два real попытался с зазором с учетом что он занимает 2х16.
проект выложи

Votrj1
04.05.2015, 21:00
Нет пока проекта то еще. Так- смотрю с чем едят. В Си есть понятие union (объединение) с выравниванием по границам слов или байт. Как это делается в кодесис? Это я так понимаю и будет ответ на мой начальный вопрос.

_Mikhail
04.05.2015, 21:06
все выравнивание и наполнение регистров делается в ручную. Изначально тебе даны пустые регистры, в которые ты сам добавляешь свои переменные в том порядке, в каком тебе надо.

александр 64
04.05.2015, 21:10
Нет пока проекта то еще. Так- смотрю с чем едят. В Си есть понятие union (объединение) с выравниванием по границам слов или байт. Как это делается в кодесис? Это я так понимаю и будет ответ на мой начальный вопрос.
ну на чем то ты же пробуешь

Votrj1
04.05.2015, 21:49
все выравнивание и наполнение регистров делается в ручную. Изначально тебе даны пустые регистры, в которые ты сам добавляешь свои переменные в том порядке, в каком тебе надо.

Mikhail спасибо! Понятно. А то меня сбило что один real в голову outputs можно прописать и все ок. Почему еще нельзя каналы открыть как в "Modbus_Slave_COM_Port" не понятно. Чувствуется разные люди писали или не доделали.

И еще из док:
"В качестве пользовательского типа данных можно объявить тип union (объединение), который не входит в число типов стандарта МЭК 61131-3.
Все компоненты такого объединения имеют одинаковый относительный адрес, т.е. все помещаются в одну область памяти. Таким образом, при определении объединения как показано на примере ниже, задание name.a также повлияет и на name.b."

Вопрос из любопытства: где узнать адрес начала массива slave outputs[]?