Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Modicon M340: Character Mode
Диалог специалистов АВОК > ОБЩИЙ ФОРУМ > Автоматизация систем
x-nikolas
Здравствуйте!
Подскажите, пожалуйста, как осуществить передачу данных между Modicon М340 Р342020 и сторонним устройством, используя "Протокол символьного режима передачи данных" (character mode).
Все мануалы на английском и пока не помогают добиться результата. Делаю в языке лестничных диаграмм. Использую функции Print_char и Input_char. Пока без стороннего устройства, просто хочу увидеть, что модикон что-то пытается передать или прочитать. Но на выходах алгоблоков GEST вижу только нули.
Если кто-то уже налаживал такую связь, поделитесь опытом. Как вообще это должно обстоять в режиме запрос-ответ между приборами?
Заранее спасибо!!
san
Пробовал когда-то на Премиуме.
С какими-то комм. функциями вобще работали в UNITY PRO? Там особенность с формированием таблицы коммуникационных параметров, надо указать количестов байт для передачи, тайм-ауты. По памяти помню что были проблемы также с формированием правильного адреса (порта ПЛК) и настройкой служебных символов. Но пока нужно добиться, я так понимаю, только мигание лампочки?
x-nikolas
Unity pro только начал осваивать, прошёл краткий курс в Шнайдере, но этой темы как раз не касались совсем.
А надо связать: устройство с интерфейсом TTY --> преобразователь TTY-RS232 --> Modicon
Насчёт настроек таймаутов и прочего - это следующий шаг. Сейчас я хочу видеть, как алгоблоки "read" и "print" сами по себе работают. То есть увидеть байт ошибки чтения-записи, байт включения чтения-записи. То есть главное сейчас - понять, что он вообще что-то пытается отослать, или принять )
san
Сразу предупреждаю, что симулятор UNITY PRO даже не попытается выполнить эту функцию. Так, на всяк случай сказал.
А вобще Вам может быть ещё полезен молодой неофициальный форум ШЕ: http://forum.se-automation.in.ua/index.php
san
поробовал на демо-стенде, с интерфейсом RS232. Есдинтсвенное, что в символьном режиме 0 принимается как конец строки.
x-nikolas
Спасибо!
А правильно ли я понимаю, что если мне нужно посылать команды устройству в шестнадцатеричном коде, то тут ничего не выйдет? И тем более, что там есть нули в запросе (см. прикреплённую картинку). Или я неправильно понял?
Нажмите для просмотра прикрепленного файла
san
Цитата(x-nikolas @ 14.2.2013, 20:41) *
Спасибо!
А правильно ли я понимаю, что если мне нужно посылать команды устройству в шестнадцатеричном коде, то тут ничего не выйдет? И тем более, что там есть нули в запросе (см. прикреплённую картинку). Или я неправильно понял?

Думаю, что да. Можно ещё у тех. поддержки спросить, может они что-то посоветуют.
san
И это получилось.
_Tommy_
Всем привет!
У меня такая же проблема. Только связать контроллер М340 и устройство (электронные весы) вроде бы получилось. А вот получить данные в адекватном виде не получается. весы передают информацию в непрерывном режиме по ASCII-протоколу объем данный 22 байта, два последних байта CR и LF. При использовании в контроллере команд INPUT_CHAR или INPUT_BYTE каждый байт потока поочередно записывается в одну и туже переменную, и не формируется строка или массив данных.
Подскажите в чем проблема.
san
Цитата(_Tommy_ @ 5.3.2013, 15:20) *
Всем привет!
У меня такая же проблема. Только связать контроллер М340 и устройство (электронные весы) вроде бы получилось. А вот получить данные в адекватном виде не получается. весы передают информацию в непрерывном режиме по ASCII-протоколу объем данный 22 байта, два последних байта CR и LF. При использовании в контроллере команд INPUT_CHAR или INPUT_BYTE каждый байт потока поочередно записывается в одну и туже переменную, и не формируется строка или массив данных.
Подскажите в чем проблема.
Нужно настроить порт на приём в символьном режиме не по таймауту (stop on silence) а по "CR LF": Stop on reception -> Character1=CR, Character2=LF. Ловить это надо INPUT_CHAR'ом.
_Tommy_
Цитата
Нужно настроить порт на приём в символьном режиме не по таймауту (stop on silence) а по "CR LF": Stop on reception -> Character1=CR, Character2=LF. Ловить это надо INPUT_CHAR'ом.

1. Принемаемое сообщение не постоянного размера. Для формирования периодичности приемки использовал %S6. Может чем другим можно синхронизировать прием?
2. В %MW101 периодически появляется значение 16#0009. Помоему означает что недостаточно места в буфере, хотя по документации написано, что переменная типа STRING формируется размером до 1024 байт. blink.gif
3. В окошке настроек порта возле галочек CR LF какой-то номер, пытаюсь его изменить галочки с CR LF пропадают. Сначала думал что номер байта остановки, теперь не знаю
4. Что дает галочка Character included?


san
Цитата(_Tommy_ @ 6.3.2013, 9:51) *
1. Принемаемое сообщение не постоянного размера. Для формирования периодичности приемки использовал %S6. Может чем другим можно синхронизировать прием?

Вам не нужна периодичность. Размер принимаемого сообщения определяется последними символами "CR" "LF". Для этого нужно активировать Character1=CR Character2=LF и ничего не трогать рядом в кокошках, так как это код ДРУГОГО символа, ОТЛИЧНОГО от CR и LF.
Цитата(_Tommy_ @ 6.3.2013, 9:51) *
2. В %MW101 периодически появляется значение 16#0009. Помоему означает что недостаточно места в буфере, хотя по документации написано, что переменная типа STRING формируется размером до 1024 байт.

Вы постоянно конвертируете строку в набор байт, а это надо делать только после получения сообщения. Факт получения сообщения можно определить по скидыванию 0-го бита в слове коммуникационных параметров.
Цитата(_Tommy_ @ 6.3.2013, 9:51) *
3. В окошке настроек порта возле галочек CR LF какой-то номер, пытаюсь его изменить галочки с CR LF пропадают. Сначала думал что номер байта остановки, теперь не знаю

Это ASCII код символа конца кадра, если он отличен от CR и LF
Цитата(_Tommy_ @ 6.3.2013, 9:51) *
4. Что дает галочка Character included?

Судя по хелпу, если галочка стоит, то конечные символы (в Вашем случае CR LF) будут в списке принимаемых, иначе туда попадёт только то, что до этих символов (данные кадра)
Вам надо правильно пользоваться коммуникационными функциями. Таблица коммуникационных параметров (4 инта) содержит информацию о:
0-й бит 0-го слова: активность функции, в 1-ке когда функция ждёт окончания обратки, 0 когда функция обработана
- для отправки сообщения, 0 говорит о том, что последовательность байт отправлена
- для приёма, 0 говорит о том, что что-то пришло или сработал тайм-аут
_Tommy_
Цитата
Вам не нужна периодичность. Размер принимаемого сообщения определяется последними символами "CR" "LF". Для этого нужно активировать Character1=CR Character2=LF и ничего не трогать рядом в кокошках, так как это код ДРУГОГО символа, ОТЛИЧНОГО от CR и LF.

К сожалению без периодичности принемаемое сообщение формируется один раз и больше не меняется. И 0-й бит 0-го слова постоянно весит в 1.
san
Цитата(_Tommy_ @ 6.3.2013, 10:49) *
К сожалению без периодичности принемаемое сообщение формируется один раз и больше не меняется. И 0-й бит 0-го слова постоянно весит в 1.
Это означает что неправильно настроен приём кадра или ...ничего не приходит.
Сделайте следующую последовательность (важно не лениться!).
1) Подключите к ПК (через COM port) Ваши весы. Попробуйте пообщаться с ними с использованием какой-то программы работы с СОМ-портом, я пользуюсь Compt.exe (дело привычки); думаю Вы многое узнаете о протоколе общения;
2) Подключите к ПК (через COM port) М340. Попробуйте выступить в роли весов: задавайте ту же последовательность, что и весы и смотрите на реакцию ПЛК. Так и отлаживайте программу ПЛК.
3) После этого пробуйте налидить дружбу между М340 и весами.

Ещё пару моментов.
1м) Вы уверены что весы общаются не по протоколу Modbus ASCII;
2м) Если там (в весах) свой протокол, то одного приёма может быть не достаточно, возможно придётся организовывать полноценный клиент-серверный протокол.
По этому приведите описание протокола весов. Будет время - гляну.
_Tommy_
В компе нету COM порта. позже возьму дома переходник USB-COM попробую связать весы с компом.
Насчет протокола, в документации сказано : "данные, передаются в ASCII-коде, и формируются в сообщения длиной 22 байта"
_Tommy_
Вот посылка принимаемая COM портом:
ST,GS,`,[.][.][.][.][.]0.2[.]kg[.][.]

или с HEX кодировкой

S(53)T(54),(2C)G(47)S(53),(2C)`(60)(7F),(2C)[.](20)[.](20)[.](20)[.](20)[.](20)0(30).(2E)2(32)[.](20)k(6B)
g(67)[.](0D)[.](0A)

Незнаю, похоже это на Mudbus ASCII протокол, или он "самопальный" ?
san
Самопальный. Пробуйте отправлять с ПК на М340. Только программу свою переделайте согласно моим рекомендациям.
_Tommy_
При передачи с компа на контроллер, программный модуль INPUT_CHAR нормально принемает только сообщение длинной в 16 символов + CR + LF
Если хотябы на один символ больше то сообщение на принемается.
san
Так наверное Вы сделали по 2-му моему примеру.
Выходную переменную опишите как String без описания длины и без привязки к локализованной памяти.
_Tommy_
У меня выходная переменная так и описана: String, и без привязки к памяти. И все таже проблема.
Если задаю длину принемаемых сообщений в String_Length то при превышении 16 символов показывает превышение буфера, код 16#0009.
Можно его как-нибудь увеличить?

Нашел размер переменной STRING в General Atributes, стоит 16. Не могу поменять.
san
Цитата("Help UNITY PRO")
The size of the character string can be optimized during the definition of the type using the STRING[<size>] command, <size> being an unsigned integer UINT capable of defining a string of between 1 and 65535 ASCII characters.

Таки больше 16-ти надо определять руцями.

Да, NB при этом=0
_Tommy_
Проканало пока с INPUT_BYTE и массивом byte из 22. Co string-ом пока касяк.
san
Определить переменную как STRING [255] да и по делом ему.
_Tommy_
ЗАРАБОТАЛО!!!!!!!!!!))))))))))
Огромное спасибо за помощь!!!!
vadym_0s
У меня вопрос по этой теме. Есть система с 5 устройств и M340 P2020. На устройстве есть RS-485. На ПЛК тоже есть RS-485. В мануале к прибору написано что нужно делать подключение по 4-проводной схеме. Посылка описана как ASCII. Я добавляю описание протокола.
Дмитрий_alt
Добрый день коллеги.
У меня вот какой вопрос - стоит задача опросить расходомер US800 (Modbus Rtu).
Связь настроил через блоки READ_Var. На выходе блока массив из 7 переменных. Все получаемые значения во-первых в виде 16#, во-вторых нужно "склеить" переменные определенным образом для получения адекватного результата (поменять местами мл. ст. байты), получить некую структуру, а ее затем перевести в читаемое значение.
Например я считываю с прибора следующие данные:
[1]=3659
[2]=-13633
[3]=-15361
[4]=-1
[5]=20
[6]=-32252
[7]=0
Если перевести в 16#, получим:
[1]=16#0E 4B
[2]=16#CA BF
[3]=16#C3 FF
[4]=16#FF FF
[5]=16#00 14
[6]=16#82 04
[7]=16#00 00
А дальше судя по методичке производителя нужно провернуть следующие преобразования - поменять местами байты и из полученной структуры получить требуемые значения (с учетом коэффициентов)
0e 4b ca bf = -1.580415 (пример мгновенного расхода)
c3 ff ff ff = -61 (накопленные расход)

Я подразумеваю, что нужно воспользоваться блоками ASCII_to_String, затем String перевести уже в числа. Но раньше со строками работать не приходилось, поэтому пока они принимают вид '‚$04' . Подскажите, может уже решали подобную задачу и все делается намного проще? Расходомеры вроде бы распространенные.
Прикладываю инструкцию по работе в сети modbus от производителя

Нажмите для просмотра прикрепленного файла
Дмитрий_alt
Сам себе ответил вот здесь
http://forum.abok.ru/index.php?showtopic=108296
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.