Easyelectronics.ru

Электроника для всех
Текущее время: 18 ноя 2018, 15:27

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: С# & Modbus
СообщениеДобавлено: 21 май 2018, 09:56 
Только пришел

Зарегистрирован: 21 май 2018, 09:22
Сообщения: 8
Нарисовалась проблемка, которую не могу решить никак. Есть программа которая по Modbus RTU должна опрашивать датчик, скорость общения 19200. Так вот, при отправке команды в сети Modbus кракозябрины, вместо данных, и ответа от прибора нет. Пишу на чистом Си и все работает, в сети нормальные символы, и ответ есть. Сеть смотрю через saleae logic. В итоге понимаю что дело в кодировке, но менял кодировки в SerialPort на разные, результат тот же. Может кто то уже так же мучался и подскажет в чем проблема. С COM портом много раз работал из дотнета, никогда проблем таких не возникало, а в чем бяда тут, не пойму никак.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 10:47 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3764
Откуда: Звенигород
Скорее всего из-за того, что у C# все работает в UTF. Смотреть соответветственно в Encoding.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 12:13 
Старожил

Зарегистрирован: 01 июл 2010, 15:30
Сообщения: 472
Откуда: Энгельс
Как организована работа с Modbus на C#? Свой велосипед или библиотека?
Я пользовался вот этим https://github.com/NModbus4/NModbus4 работает хорошо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 13:11 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 661
На шарпе крос-платформенную либу серверной части писал в феврале, все работает без проблем - смотрите внимательно свои отправки возможно не указано явно што данные надо преобразовывать в нужный формат.

К примеру под виндой для Modbus ASCII отправка 16 данных в порт будут выглядеть так
Код:
port.Write(i.ToString("X"));

Т.е. нужно явно указывать что будет произведено преобразование из переменной типа INTEGER в Строковую переменную в 16 формате.

Скорее всего вы где то пропустили это.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 13:14 
Заглядывает иногда

Зарегистрирован: 16 окт 2013, 20:15
Сообщения: 160
Откуда: Екатеринбург
sed_alex писал(а):
К примеру под виндой для Modbus ASCII отправка 16 данных в порт будут выглядеть так
Код:
port.Write(i.ToString("X"));

Т.е. нужно явно указывать что будет произведено преобразование из переменной типа INTEGER в Строковую переменную в 16 формате.
Скорее всего вы где то пропустили это.
Я правильно понимаю, что преобразование в строковые переменные требуется только в случае с Modbus ASCII? Насколько помню, в RTU летит plain-data - без всяких преобразований.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 13:52 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 661
Порфирий писал(а):
sed_alex писал(а):
К примеру под виндой для Modbus ASCII отправка 16 данных в порт будут выглядеть так
Код:
port.Write(i.ToString("X"));

Т.е. нужно явно указывать что будет произведено преобразование из переменной типа INTEGER в Строковую переменную в 16 формате.
Скорее всего вы где то пропустили это.
Я правильно понимаю, что преобразование в строковые переменные требуется только в случае с Modbus ASCII? Насколько помню, в RTU летит plain-data - без всяких преобразований.


Все верно преобразование в строку нужно для ASCII..

Снифером нужно просто посмотреть что вылетает и отсюда уже плясать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 14:39 
Старожил
Аватара пользователя

Зарегистрирован: 14 фев 2012, 19:11
Сообщения: 326
Откуда: Энергодар, Нижневартовск, Екатеринбург
Код в студию.

_________________
git.io/vOZo0


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 17:11 
Только пришел

Зарегистрирован: 21 май 2018, 09:22
Сообщения: 8
Так говорю же, Encoding у SerialPort менял, ставил и UTF и ASCII, ничего не меняется на выходе. Вот я и задумался, может где то в другом месте надо кодировку менять. Данные отправляю в порт массивом байт. Могу вечером кусок кода скинуть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 17:11 
Только пришел

Зарегистрирован: 21 май 2018, 09:22
Сообщения: 8
о как много написали пока я отвечал )))) Вечером код выложу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 17:14 
Только пришел

Зарегистрирован: 21 май 2018, 09:22
Сообщения: 8
neiver писал(а):
Как организована работа с Modbus на C#? Свой велосипед или библиотека?
Я пользовался вот этим https://github.com/NModbus4/NModbus4 работает хорошо.


сие я тоже ковырял, но оно совсем не идет под CompactFramwork, а переписывать его оттуда из исходников долго. В принципе свой велосипед писал на основе этого примера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 21:55 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
Код:
try
            {
                // настройки порта
                port.PortName = "COM" + textBox1.Text;
                port.BaudRate = 19200;
                port.DataBits = 8;
                port.Parity = Parity.None;
                port.StopBits = StopBits.One;
                port.ReadTimeout = 1000;
                port.WriteTimeout = 1000;
                port.Encoding = Encoding.UTF32;
                port.Open();
            }
            catch (Exception er)
            {
                Console.WriteLine("ERROR: невозможно открыть порт:" + er.ToString());
                return;
            }
            byte[] Send = new byte[8];
            byte High, Low;
            Send[0] = Convert.ToByte(1);     //Номер прибора
            Send[1] = Convert.ToByte(3);                             //Функция
            byte[] _adr = BitConverter.GetBytes(0);
            Send[2] = _adr[1];                             //Старший байт № первого регистра
            Send[3] = _adr[0];                             //Мл. байт № первого регистра
            byte[] _length = BitConverter.GetBytes(1);
            Send[4] = _length[1];                             //Ст. байт кол-ва регистров для чтения
            Send[5] = _length[0];                           //Мл. байт кол-ва регистров для чтения
            MyCRC(Send, 6, out High, out Low);
            byte[] crc = BitConverter.GetBytes(ComputeChecksum(Send));
            Send[6] = crc[1];
            Send[7] = crc[0];
           
            port.Write(Send, 0, 8);


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 22:23 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2134
Откуда: Нальчик
Seyran писал(а):
Код:
            Send[0] = Convert.ToByte(1);     //Номер прибора
            Send[1] = Convert.ToByte(3);                             //Функция
            byte[] _adr = BitConverter.GetBytes(0);
            Send[2] = _adr[1];                             //Старший байт № первого регистра
            Send[3] = _adr[0];                             //Мл. байт № первого регистра
            byte[] _length = BitConverter.GetBytes(1);
            Send[4] = _length[1];                             //Ст. байт кол-ва регистров для чтения
            Send[5] = _length[0];                           //Мл. байт кол-ва регистров для чтения
            MyCRC(Send, 6, out High, out Low);
            byte[] crc = BitConverter.GetBytes(ComputeChecksum(Send));
            Send[6] = crc[1];
            Send[7] = crc[0];
           
            port.Write(Send, 0, 8);



Я у себя в шарпе так заполнял массивчик для COM порта, вроде проблем не было...
Код:
            byte[] FlashAddrCmd = { (byte)'A', 0, 0 };
            byte[] FlashWrCmd = { (byte)'B', 0, 0x80, (byte)'F' };
            byte[] FlashVfCmd = { (byte)'g', 0, 0x80, (byte)'F' };
            byte[] ExitCmd = { (byte)'L', (byte)'E'};



Просто глянь на данные запроса через saleae logic и сразу станет понятно, в каком месте не правильно формируются данные...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 22:26 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
так в том то и бяда, что они в порт неправилно уже приходят


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 22:32 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2134
Откуда: Нальчик
Seyran писал(а):
так в том то и бяда, что они в порт неправилно уже приходят

т.е. все данные не правильны... или какие то байты правильно а какие то нет???
По идее если 16-тиричные данные выводишь в COM то кодировка не при чем, должны отправляться фактические данные...
или я чего то не понимаю...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 23:14 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
да, вот точно токое же если вдруг файл UTF откроешь в аски редакторе, то есть трефы бубны и прочие символы, да что я морочусь. ща картинки прикреплю

Изображение

вот сообщение из проги на Си, на которую прибор отвечает

Изображение

а вот что из под дотнет получается


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 21 май 2018, 23:38 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2134
Откуда: Нальчик
Сделайте еще раз такие же две картинки, но так чтобы байты были крупнее, чтобы видно было как анализатор идентифицирует байты...
Сейчас не понятно, что там у вас... и детализацию картинок помельче, чего жадничать на разрешении то... и лучше сюда картинки а не на всякие непонятные сайты...

Например сделайте фото первых 10 байт посылки, так чтобы анализатор обозначил и подписал каждый отдельный байт
Анализатор настройте так, чтобы он подписывал шестнадцатеричное значение каждого байта, а не ждал например символьных строк


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:08 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
как сюда ? я немогу картинки крепить прямо в топику


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:14 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2134
Откуда: Нальчик
Seyran писал(а):
как сюда ? я немогу картинки крепить прямо в топику

Драсьти я ваша тетя... вы же программист, не ужто картинку не могете прицепить...
Вот как то так картинки цепляются...


Вложения:
Скриншот-2018-05-21-22.10.jpg
Скриншот-2018-05-21-22.10.jpg [ 51.62 Кб | Просмотров: 931 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:15 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
Вложение:
4.png
4.png [ 31.56 Кб | Просмотров: 930 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:16 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
вот нормальная


Вложения:
3.png
3.png [ 17.08 Кб | Просмотров: 929 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:31 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
обана, понизил скорость до 9600, и вот что получилось


Вложения:
5.png
5.png [ 19.41 Кб | Просмотров: 921 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:38 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2134
Откуда: Нальчик
У вас даже на рабочем варианте картинки нестыковки со скоростью... заметьте красные точки которыми анализатор помечает не адекватные места...
А про нерабочие картинки я вообще молчу, там не первая ни вторая и близко не на той скорости идут на какую анализатор настроен...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:44 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2134
Откуда: Нальчик
Попробуйте просто сделать на шарпе тестовую прогу, которая будет передавать простой короткий пакет, например {0x00, 0xFF, 0xAA}, или просто байт...
И хотя бы убедитесь что вы его в анализаторе адекватно видите


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 00:55 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2134
Откуда: Нальчик
Сбивал с толку верхний меандр из двух на картинке... сейчас понял что смотреть нужно только на нижний...

В таком случае последняя картинка со скоростью 9600 - не правильная, там две точки анализатора приходятся на один бит передачи, все таки скорость должна быть 19200


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: С# & Modbus
СообщениеДобавлено: 22 май 2018, 01:30 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 90
спасибо, поковыряю еще немного и отпишусь.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: VladislavS


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB