PDA

Просмотр полной версии : Передача String по MobBus?



Herzog
18.03.2011, 17:39
Я новичок и вопрос может показаться дурацким.
Но...

У меня задача - собранные виде длинных строк (дата и время события, параметр 1, параметр 2...) данные передавать из управляющего ПЛК в PC.
Захотелось воспользоваться стандартным ModBus (глубоко личный Owen-овский протокол совсем не привлекает).
Как я понял, передавать по MobBus можно, либо настроив конфигурацию ПЛК, либо воспользовавшись самодельными библиотеками.

Плюс первого варианта - после конфигурирования я просто использую передаваемые переменные в программе, не задумываясь, как идет обмен. Но доступные для передачи переменные при конфигурации имеют максимум размерность два байта (регистр), из-за чего приходится делать противную операцию разбиения каждой записи-строки и распихивания ее частей по двухбайтным переменным. Для 32-байтной строки заводить 16 переменных и раскладывать по ним строку?
Отвратно.

Плюс второго варианта - возможность настроить обмен по своему желанию. Но минус - разбираться в последовательности и самих функциях библиотеки по скупым комментариям, т.к. внятного описания "что, зачем и в каком порядке", я пока не нашел.

Что делать? как передать длинную строку через ModBus?

С уважением,
Herzog

Gans
19.03.2011, 08:34
а может данные шифровать, а на компе расшифровывать?
Например: 18 бит - это насос №2 включен, а регистр 35 = это номер этапа операции и тд.

Herzog
21.03.2011, 10:26
Если слейв - то на область io можно наложить указатель на любую структуру и не париться.Вот с этого места поподробнее, пожалуйста..

Есть AS:String(32).
Что мне нужно указать во вкладке CoDeSys "конфигурации ПЛК" для ModBus (доступны переменные типа 2-байта, 8-бит, 4-байта или float), чтобы передалась вся строка AS в одном пакете?
Если я там напишу указатель на строку, то передаваться будет 4-байтное число, соответствующее адресу строки, а не сама строка.

С уважением,
Herzog

Herzog
23.03.2011, 09:39
Plc у меня слейв, разумеется.

А с указателем ничего не получится.
Явного преобразования типов нет и если я в помещаю в четырех байтную переменную модбаса адрес строки, то помещаю только число типа dword а не собственно строку, на которую pointer указывает. В результате у меня передастся в компи-мастер не 32 байта содержимого строки, а четыре, изображающие ее адрес.

Мне это не нужно, мне нужно передать строку. Так как это сделать?

С уважением,
Herzog

Herzog
23.03.2011, 16:53
Где адрес-то кладется ?Вы не поняли меня.

Еще раз повторяю - мне из plc нужно передать строку.
Вы же мне пишите pstr := адр(модбас_переменная), чтобы принять в строку plc переменную от компи, а мне строку из plc нужно передать в компи.

Передать dword число в строку нет проблем, ложку воды легко можно налить в стакан и я бы не просил в этом помощи.
Но мне нужно не это.
Мне нужно передать длинную строку из plc в компи. А в модбас, если я правильно понял, можно завести переменные не длиннее dword-овской. Т.е. получается, что передавать можно стакан информации (string) только, разбивая по чайным ложечкам (типа dword).
Что довольно противно и непонятно, как обойти эту проблему.

Чтобы было совсем понятно и поконкретней- как передать строковую переменную типа DT#1970-01-01-00:00:01 через модбас за один пакет?

C уважением,
Herzog

Crusash
23.03.2011, 17:35
Herzog, если я правильно понял Валенка, надо делать так:
В конфигураторе МодБас(слейв) создайте кучу регистров( для string(32) аж 16 штук dword), а потом по адресу первого регистра записываете свою строку. а уже PC её обрабатывает...

Herzog
25.03.2011, 16:45
Сильно сомневаюсь, что переменные так и будут стоять в памяти столбиком в порядке своего ввода...

Но я получил наконец-таки "железку" ПЛК и теперь наступило время проб методом тыка.

Спасибо за ответ,
Herzog

fpy
10.05.2020, 12:48
Всем программного успеха!

я эту проблему решил так, использовал owen ПЛК как Modbus Master, на компьютере организовал modbus Slave.

48923

в modbus master у Овен есть передача строки.
длину строки приходится передавать отдельным регистром


если пригодится, расшифровываю строку на C# я так:
48924