На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (6) 1 [2] 3 4 ... Последняя » все  ( Перейти к последнему сообщению )  
> ModBus
    Цитата
    VorteKC, 14.12.03, 21:04
    Поделись пожалуйста исходниками своей библиотеки.
    Вот этого я сделать не могу. smile.gif
    Коммерческая разработка. smile.gif
      Могу подкинуть сорс класса реализующего работу с СОМ-портом. Класс правда для Visual С, но думаю идею он раскрыть сможет.

      Я его юзаю постоянно.

      Буду вопросы - пиши.
      Прикреплённый файлПрикреплённый файлSerialPort.zip (6.67 Кбайт, скачиваний: 1595)
        Как быть если требуется пользовать MODBUS-ASCII. Я вот смотрю обучно строчку побайтово передают и радуются :-) а мне-то нужно передать именно что строчку из шестнадцатиричных чисел. Как быть? Да и к тому же, 16-ти ричные числа двух-символьные... или это никак не влияет?
        Благодарю.
          Цитата Cergiy @
          а мне-то нужно передать именно что строчку из шестнадцатиричных чисел. Как быть?
          А у этой строчки посчитать количество потребных для передачи байтов нельзя?

          Цитата Cergiy @
          Да и к тому же, 16-ти ричные числа двух-символьные... или это никак не влияет?
          см. выше
            trainer я сейчас спрошу нечто глупое, а я должен переводить эту строчку в какой-то иной формат(из строкового) чтобы передавать? то есть как осуществить передачу символов, а не чисел? Или я уже слишком вечером туплю?
              Цитата Cergiy @
              Или я уже слишком вечером туплю?
              Очень похоже, что да.

              Цитата Cergiy @
              а я должен переводить эту строчку в какой-то иной формат(из строкового) чтобы передавать?
              По этому поводу ничего сказать не могу. Спецификации Modbus под рукой нет.

              Цитата Cergiy @
              то есть как осуществить передачу символов, а не чисел?
              Так или иначе, а передается набор байтов.
                To trainer
                Спасибо за библиотеку TrComPort :)
                Работает существенно быстрее, чем ComPortLib.
                Вы писали, что можете выложить более свежую версию.(Я скачал от 2003г)
                Если не затруднит, буду весьма признателен.

                Вопрос для общего развития.
                Если я просто подключаю Вашу библиотеку к проекту, все замечательно.
                Решил сам сделать библиотеку из Вашей DLL.
                ExpandedWrap disabled
                         impdef.exe -h TrComPort.def TrComPort.dll
                         implib.exe -c -f TrComPort_BCB.lib TrComPort.def

                Библиотека получается меньше, почти вся заполнена нулями
                и ,естественно, ничего не работает.
                В чем я неправ?
                Поиск обшарил почти весь, включая FAQ
                Сообщение отредактировано: oksman -
                  Здравствуйте coach. :)
                  У меня возникли вопросы по вашей программе TrComPort. У меня в распоряжении прибор МВУ-8, который работает по протоколу ModBus RTU, адрес 16. Я передаю в функцию TrComPortWriteArray следующее сообщение: 0x10 - адрес, 0x10 - команда, 0x00, 0x00 - нач. адрес регистра, 0x00, 0x01 - количество регистров, 0x02 - количество байт, 0x10, 0x00 - значение, CRC_Low, CRC_High. У меня оно отрабатывает, т.е. result=0, но состояние выхода прибора не изменяет. В чем может быть проблема?

                  И мне интересен следующий вопрос: Чтение с прибора, как я понял, тоже выполняется функцией TrComPortWriteArray. Но куда записываются прочитанные значения?

                  Буду очень признателен, С уважением, Павел. ;)
                    там вообще-то в комментариях написано, что делает каждая функция. Чтение массива байт выполняет TrComPortReadArray
                    Цитата Pauly @
                    У меня оно отрабатывает, т.е. result=0, но состояние выхода прибора не изменяет. В чем может быть проблема?
                    А прибор не должен квитировать команду? Если должен - надо прочитать его ответ, наверняка он должен возвращать код ошибки в случае отказа выполнять команду.
                      Для чтения у меня есть сообщение в котором задается команда 0x03 вместо 0x10. Это сообщение нужно подавать параметром rd_buffer в TrComPortReadArray?

                      Когда я читаю ответ прибора функцией TrComPortWriteAndRead, то result=-10, а rd_buffer пустой.
                        -10 - это значит прочитать запрошенное количество байт не удалось, истек тайм-аут. Либо размер ответа меньше, чем затребовано к прочтению, либо прибор вовсе не ответил.
                        Цитата Pauly @
                        Для чтения у меня есть сообщение в котором задается команда 0x03 вместо 0x10. Это сообщение нужно подавать параметром rd_buffer в TrComPortReadArray?
                        Надо передать команду функцией TrComPortWriteArray и прочитать ответ функцией TrComPortReadArray. Или воспользоваться функцией 2-в-1 TrComPortWriteAndRead
                          Я не уверен, что он этот прибор должен слать ответ, по крайней мере у меня нет формата приема данных. Я выставлял всякие размеры ответа, ошибка остается. Связь с прибором устанавливается и по другому протоколу обмен удается.

                          У другого прибора есть и посылка, и прием, для него я использую TrComPortWriteAndRead, но у меня нет его на руках, поэтому я решил проверить работоспособность на МВУ.
                            Здравствуйте trainer. Помогите пожалуйста в следующем вопросе: Я считываю параметры прибора в потоке(Thread). В главной программе я останавливаю поток(Terminate), закрываю COM-порт и потом заново пытаюсь открыть COM-порт, а у меня выдается ошибка -2. Как я понимаю, в процесс остановки потока у меня может происходить обращение к COM-порту и он закрывается некорректно. Для решения этого я использую функцию TrComPortBreak, однако она ничего не дает. Не могли бы вы подсказать, что нужно сделать для корректного закрытия порта?
                              Terminate вообще-то не останавливает поток, а просит его завершиться.
                              TrComPortBreak надо вызывать из основного потока.
                              Цитата Pauly @
                              Как я понимаю, в процесс остановки потока у меня может происходить обращение к COM-порту и он закрывается некорректно.
                              Это сильно вряд ли. Порт либо закроется, либо нет.
                                При закрытии формы выполняется следующий код:

                                result = TrComPortBreak(PortId);
                                FirstProcess->Terminate(); //поток, где выполняется чтение/запись по ModBus
                                result = TrComPortClose(PortId);
                                PortId = TrComPortOpen(5);

                                При закрытии порта ошибки действительно нет, а вот при открытии возникает -2, причем не всегда. Если я запускаю программу еще раз, то порт открывается нормально. Может быть порт не открывается из-за того, что дочерний поток закрывается, а TrComPortWriteAndRead еще до конца не сработал?

                                В чем ошибка в моих действиях?

                                Заранее благодарен, Павел.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0361 ]   [ 17 queries used ]   [ Generated: 24.04.24, 21:30 GMT ]